Showing preview only (2,452K chars total). Download the full file or copy to clipboard to get everything.
Repository: freeCodeCamp/devdocs
Branch: main
Commit: c8e8f32101dd
Files: 1340
Total size: 2.1 MB
Directory structure:
gitextract_4et9rv65/
├── .dockerignore
├── .editorconfig
├── .github/
│ ├── CODEOWNERS
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ ├── documentation_bug.md
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── no-response.yml
│ └── workflows/
│ ├── build.yml
│ ├── docker-build.yml
│ ├── schedule-doc-report.yml
│ └── test.yml
├── .gitignore
├── .image_optim.yml
├── .ruby-version
├── .slugignore
├── .tool-versions
├── COPYRIGHT
├── Dockerfile
├── Dockerfile-alpine
├── Gemfile
├── LICENSE
├── Procfile
├── README.md
├── Rakefile
├── Thorfile
├── assets/
│ ├── images/
│ │ └── .gitignore
│ ├── javascripts/
│ │ ├── app/
│ │ │ ├── app.js
│ │ │ ├── config.js.erb
│ │ │ ├── db.js
│ │ │ ├── router.js
│ │ │ ├── searcher.js
│ │ │ ├── serviceworker.js
│ │ │ ├── settings.js
│ │ │ ├── shortcuts.js
│ │ │ └── update_checker.js
│ │ ├── application.js
│ │ ├── collections/
│ │ │ ├── collection.js
│ │ │ ├── docs.js
│ │ │ ├── entries.js
│ │ │ └── types.js
│ │ ├── debug.js
│ │ ├── docs.js.erb
│ │ ├── lib/
│ │ │ ├── ajax.js
│ │ │ ├── cookies_store.js
│ │ │ ├── events.js
│ │ │ ├── favicon.js
│ │ │ ├── license.js
│ │ │ ├── local_storage_store.js
│ │ │ ├── page.js
│ │ │ └── util.js
│ │ ├── models/
│ │ │ ├── doc.js
│ │ │ ├── entry.js
│ │ │ ├── model.js
│ │ │ └── type.js
│ │ ├── news.json
│ │ ├── templates/
│ │ │ ├── base.js
│ │ │ ├── error_tmpl.js
│ │ │ ├── notice_tmpl.js
│ │ │ ├── notif_tmpl.js
│ │ │ ├── pages/
│ │ │ │ ├── about_tmpl.js
│ │ │ │ ├── help_tmpl.js
│ │ │ │ ├── news_tmpl.js.erb
│ │ │ │ ├── offline_tmpl.js
│ │ │ │ ├── root_tmpl.js.erb
│ │ │ │ ├── settings_tmpl.js
│ │ │ │ └── type_tmpl.js
│ │ │ ├── path_tmpl.js
│ │ │ ├── sidebar_tmpl.js
│ │ │ └── tip_tmpl.js
│ │ ├── tracking.js
│ │ ├── vendor/
│ │ │ ├── cookies.js
│ │ │ ├── mathml.js
│ │ │ ├── prism.js
│ │ │ └── raven.js
│ │ └── views/
│ │ ├── content/
│ │ │ ├── content.js
│ │ │ ├── entry_page.js
│ │ │ ├── offline_page.js
│ │ │ ├── root_page.js
│ │ │ ├── settings_page.js
│ │ │ ├── static_page.js
│ │ │ └── type_page.js
│ │ ├── layout/
│ │ │ ├── document.js
│ │ │ ├── menu.js
│ │ │ ├── mobile.js
│ │ │ ├── path.js
│ │ │ ├── resizer.js
│ │ │ └── settings.js
│ │ ├── list/
│ │ │ ├── list_focus.js
│ │ │ ├── list_fold.js
│ │ │ ├── list_select.js
│ │ │ └── paginated_list.js
│ │ ├── misc/
│ │ │ ├── news.js
│ │ │ ├── notice.js
│ │ │ ├── notif.js
│ │ │ ├── tip.js
│ │ │ └── updates.js
│ │ ├── pages/
│ │ │ ├── base.js
│ │ │ ├── hidden.js
│ │ │ ├── jquery.js
│ │ │ ├── rdoc.js
│ │ │ ├── sqlite.js
│ │ │ └── support_tables.js
│ │ ├── search/
│ │ │ ├── search.js
│ │ │ └── search_scope.js
│ │ ├── sidebar/
│ │ │ ├── doc_list.js
│ │ │ ├── doc_picker.js
│ │ │ ├── entry_list.js
│ │ │ ├── results.js
│ │ │ ├── sidebar.js
│ │ │ ├── sidebar_hover.js
│ │ │ └── type_list.js
│ │ └── view.js
│ └── stylesheets/
│ ├── application.css.scss
│ ├── components/
│ │ ├── _app.scss
│ │ ├── _content.scss
│ │ ├── _environment.scss.erb
│ │ ├── _fail.scss
│ │ ├── _header.scss
│ │ ├── _mobile.scss
│ │ ├── _notice.scss
│ │ ├── _notif.scss
│ │ ├── _page.scss
│ │ ├── _path.scss
│ │ ├── _prism.scss
│ │ ├── _settings.scss
│ │ └── _sidebar.scss
│ ├── global/
│ │ ├── _base.scss
│ │ ├── _classes.scss
│ │ ├── _icons.scss.erb
│ │ ├── _mixins.scss
│ │ ├── _print.scss
│ │ ├── _variables-dark.scss
│ │ ├── _variables-light.scss
│ │ └── _variables.scss
│ └── pages/
│ ├── _angular.scss
│ ├── _angularjs.scss
│ ├── _apache.scss
│ ├── _async.scss
│ ├── _bash.scss
│ ├── _bootstrap.scss
│ ├── _cakephp.scss
│ ├── _chef.scss
│ ├── _clojure.scss
│ ├── _codeception.scss
│ ├── _coffeescript.scss
│ ├── _cordova.scss
│ ├── _cppref.scss
│ ├── _crystal.scss
│ ├── _cypress.scss
│ ├── _d.scss
│ ├── _d3.scss
│ ├── _dart.scss
│ ├── _dojo.scss
│ ├── _drupal.scss
│ ├── _eigen3.scss
│ ├── _elisp.scss
│ ├── _elixir.scss
│ ├── _ember.scss
│ ├── _erlang.scss
│ ├── _express.scss
│ ├── _fastapi.scss
│ ├── _fluture.scss
│ ├── _git.scss
│ ├── _github.scss
│ ├── _gnu_make.scss
│ ├── _gnuplot.scss
│ ├── _go.scss
│ ├── _graphite.scss
│ ├── _groovy.scss
│ ├── _gtk.scss
│ ├── _hapi.scss
│ ├── _haproxy.scss
│ ├── _haskell.scss
│ ├── _jasmine.scss
│ ├── _jekyll.scss
│ ├── _joi.scss
│ ├── _jq.scss
│ ├── _jquery.scss
│ ├── _julia.scss
│ ├── _knockout.scss
│ ├── _kotlin.scss
│ ├── _kubectl.scss
│ ├── _kubernetes.scss
│ ├── _laravel.scss
│ ├── _liquid.scss
│ ├── _lit.scss
│ ├── _love.scss
│ ├── _lua.scss
│ ├── _mariadb.scss
│ ├── _mdn.scss
│ ├── _meteor.scss
│ ├── _mkdocs.scss
│ ├── _modernizr.scss
│ ├── _moment.scss
│ ├── _nginx.scss
│ ├── _node.scss
│ ├── _npm.scss
│ ├── _nushell.scss
│ ├── _octave.scss
│ ├── _openjdk.scss
│ ├── _openlayers.scss
│ ├── _perl.scss
│ ├── _phalcon.scss
│ ├── _phaser.scss
│ ├── _php.scss
│ ├── _phpunit.scss
│ ├── _postgres.scss
│ ├── _pug.scss
│ ├── _pygame.scss
│ ├── _python.scss
│ ├── _qt.scss
│ ├── _ramda.scss
│ ├── _rdoc.scss
│ ├── _react.scss
│ ├── _react_native.scss
│ ├── _reactivex.scss
│ ├── _redis.scss
│ ├── _rethinkdb.scss
│ ├── _rfc.scss
│ ├── _rubydoc.scss
│ ├── _rust.scss
│ ├── _rxjs.scss
│ ├── _sanctuary.scss
│ ├── _sanctuary_def.scss
│ ├── _sanctuary_type_classes.scss
│ ├── _scala.scss
│ ├── _simple.scss
│ ├── _sinon.scss
│ ├── _sphinx.scss
│ ├── _sphinx_simple.scss
│ ├── _sqlite.scss
│ ├── _support_tables.scss
│ ├── _tailwindcss.scss
│ ├── _tcl_tk.scss
│ ├── _tensorflow.scss
│ ├── _terraform.scss
│ ├── _typescript.scss
│ ├── _underscore.scss
│ ├── _vue.scss
│ ├── _webpack.scss
│ ├── _wordpress.scss
│ ├── _yard.scss
│ └── _yii.scss
├── config.ru
├── docs/
│ ├── adding-docs.md
│ ├── file-scrapers.md
│ ├── filter-reference.md
│ ├── maintainers.md
│ └── scraper-reference.md
├── lib/
│ ├── app.rb
│ ├── docs/
│ │ ├── core/
│ │ │ ├── autoload_helper.rb
│ │ │ ├── doc.rb
│ │ │ ├── entry_index.rb
│ │ │ ├── filter.rb
│ │ │ ├── filter_stack.rb
│ │ │ ├── instrumentable.rb
│ │ │ ├── manifest.rb
│ │ │ ├── models/
│ │ │ │ ├── entry.rb
│ │ │ │ └── type.rb
│ │ │ ├── page_db.rb
│ │ │ ├── parser.rb
│ │ │ ├── request.rb
│ │ │ ├── requester.rb
│ │ │ ├── response.rb
│ │ │ ├── scraper.rb
│ │ │ ├── scrapers/
│ │ │ │ ├── file_scraper.rb
│ │ │ │ └── url_scraper.rb
│ │ │ ├── subscriber.rb
│ │ │ └── url.rb
│ │ ├── filters/
│ │ │ ├── angular/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_v18.rb
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_v2.rb
│ │ │ ├── angularjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_urls.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ansible/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── apache/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── apache_pig/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── astro/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── async/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── axios/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── babel/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── backbone/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bash/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bazel/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bluebird/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bootstrap/
│ │ │ │ ├── clean_html_v3.rb
│ │ │ │ ├── clean_html_v4.rb
│ │ │ │ ├── clean_html_v5.rb
│ │ │ │ ├── entries_v3.rb
│ │ │ │ ├── entries_v4.rb
│ │ │ │ └── entries_v5.rb
│ │ │ ├── bottle/
│ │ │ │ └── entries.rb
│ │ │ ├── bower/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bun/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── c/
│ │ │ │ └── entries.rb
│ │ │ ├── cakephp/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_39_plus.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_39_plus.rb
│ │ │ ├── chai/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── chef/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── chefclient/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── click/
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── clojure/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cmake/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── codeception/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── codeceptjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── codeigniter/
│ │ │ │ └── entries.rb
│ │ │ ├── coffeescript/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_v1.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_v1.rb
│ │ │ ├── composer/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cordova/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_core.rb
│ │ │ │ └── entries.rb
│ │ │ ├── core/
│ │ │ │ ├── apply_base_url.rb
│ │ │ │ ├── attribution.rb
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_local_urls.rb
│ │ │ │ ├── clean_text.rb
│ │ │ │ ├── container.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── images.rb
│ │ │ │ ├── inner_html.rb
│ │ │ │ ├── internal_urls.rb
│ │ │ │ ├── normalize_paths.rb
│ │ │ │ ├── normalize_urls.rb
│ │ │ │ ├── parse_cf_email.rb
│ │ │ │ └── title.rb
│ │ │ ├── couchdb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cpp/
│ │ │ │ └── entries.rb
│ │ │ ├── cppref/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── fix_code.rb
│ │ │ ├── crystal/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── css/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cypress/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── d/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── d3/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries_v3.rb
│ │ │ │ └── entries_v4.rb
│ │ │ ├── dart/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── deno/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── django/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── fix_urls.rb
│ │ │ ├── django_rest_framework/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── docker/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── dojo/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_urls.rb
│ │ │ │ └── entries.rb
│ │ │ ├── dom/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── drupal/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── internal_urls.rb
│ │ │ │ └── normalize_paths.rb
│ │ │ ├── duckdb/
│ │ │ │ ├── attribution.rb
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── eigen3/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── electron/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── elisp/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── elixir/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ember/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── enzyme/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── erlang/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── esbuild/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── eslint/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── express/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── falcon/
│ │ │ │ └── entries.rb
│ │ │ ├── fastapi/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── container.rb
│ │ │ │ └── entries.rb
│ │ │ ├── fish/
│ │ │ │ ├── clean_html_custom.rb
│ │ │ │ ├── clean_html_sphinx.rb
│ │ │ │ ├── entries_custom.rb
│ │ │ │ └── entries_sphinx.rb
│ │ │ ├── flask/
│ │ │ │ └── entries.rb
│ │ │ ├── flow/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── fluture/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gcc/
│ │ │ │ └── clean_html.rb
│ │ │ ├── git/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── github/
│ │ │ │ └── clean_html.rb
│ │ │ ├── gnu/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gnu_cobol/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gnu_make/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gnuplot/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── go/
│ │ │ │ ├── attribution.rb
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── godot/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── clean_html_v3.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── graphite/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── graphviz/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── groovy/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── grunt/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gtk/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── hammerspoon/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── handlebars/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── hapi/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── haproxy/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── haskell/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── haxe/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── homebrew/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── html/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── htmx/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── http/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── i3/
│ │ │ │ └── entries.rb
│ │ │ ├── immutable/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── influxdata/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jasmine/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── javascript/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jekyll/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jest/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jinja/
│ │ │ │ └── entries.rb
│ │ │ ├── joi/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jq/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jquery/
│ │ │ │ └── clean_html.rb
│ │ │ ├── jquery_core/
│ │ │ │ └── entries.rb
│ │ │ ├── jquery_mobile/
│ │ │ │ └── entries.rb
│ │ │ ├── jquery_ui/
│ │ │ │ └── entries.rb
│ │ │ ├── jsdoc/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── julia/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_sphinx.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_sphinx.rb
│ │ │ ├── knockout/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── koa/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── kotlin/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── kubectl/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── kubernetes/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── laravel/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── latex/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── leaflet/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── less/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── liquid/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── lit/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── lodash/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── love/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── lua/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── man/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── mariadb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── erase_invalid_pages.rb
│ │ │ ├── marionette/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── markdown/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── matplotlib/
│ │ │ │ └── entries.rb
│ │ │ ├── mdn/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── compat_tables.rb
│ │ │ ├── meteor/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── minitest/
│ │ │ │ └── entries.rb
│ │ │ ├── mkdocs/
│ │ │ │ └── clean_html.rb
│ │ │ ├── mocha/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── modernizr/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── moment/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── moment_timezone/
│ │ │ │ └── entries.rb
│ │ │ ├── mongoose/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nextjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nginx/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nginx_lua_module/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nim/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nix/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── node/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── old_entries.rb
│ │ │ ├── nokogiri2/
│ │ │ │ └── entries.rb
│ │ │ ├── npm/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── numpy/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nushell/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── fix_links.rb
│ │ │ ├── ocaml/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── octave/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── opengl/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── openjdk/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_new.rb
│ │ │ │ ├── clean_urls.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_new.rb
│ │ │ ├── openlayers/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── opentsdb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── padrino/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pandas/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── perl/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── phalcon/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── phaser/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── php/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── fix_urls.rb
│ │ │ │ └── internal_urls.rb
│ │ │ ├── phpunit/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── playwright/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── point_cloud_library/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pony/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── postgresql/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── extract_metadata.rb
│ │ │ │ └── normalize_class_names.rb
│ │ │ ├── prettier/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pug/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── puppeteer/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pygame/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── python/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── pytorch/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── q/
│ │ │ │ └── entries.rb
│ │ │ ├── qt/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── qunit/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── r/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rails/
│ │ │ │ ├── clean_html_guides.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ramda/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rdoc/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── container.rb
│ │ │ │ └── entries.rb
│ │ │ ├── react/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_react_dev.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_react_dev.rb
│ │ │ ├── react_bootstrap/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── react_native/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── react_router/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── reactivex/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── redis/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── redux/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── relay/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── requests/
│ │ │ │ └── entries.rb
│ │ │ ├── requirejs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rethinkdb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ruby/
│ │ │ │ └── entries.rb
│ │ │ ├── rust/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rxjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── salt_stack/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sanctuary/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sanctuary_def/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sanctuary_type_classes/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sass/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── scala/
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── clean_html_v3.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── scikit_image/
│ │ │ │ └── entries.rb
│ │ │ ├── scikit_learn/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sequelize/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sinon/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── socketio/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sphinx/
│ │ │ │ └── clean_html.rb
│ │ │ ├── spring_boot/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sqlite/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_js_tables.rb
│ │ │ │ └── entries.rb
│ │ │ ├── statsmodels/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── svelte/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── svg/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── symfony/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── tailwindcss/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── noop.rb
│ │ │ ├── tcl_tk/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── tcllib/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── nop.rb
│ │ │ ├── tensorflow/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── terraform/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── threejs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── trio/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── twig/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── typescript/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── underscore/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vagrant/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── varnish/
│ │ │ │ └── entries.rb
│ │ │ ├── vertx/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vite/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vitest/
│ │ │ │ └── entries.rb
│ │ │ ├── vue/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── vue_router/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vueuse/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vuex/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vulkan/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── wagtail/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── web_extensions/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── webpack/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── werkzeug/
│ │ │ │ └── entries.rb
│ │ │ ├── wordpress/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── xslt_xpath/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── yarn/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_berry.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_berry.rb
│ │ │ ├── yii/
│ │ │ │ ├── clean_html_v1.rb
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── entries_v1.rb
│ │ │ │ └── entries_v2.rb
│ │ │ ├── zig/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ └── zsh/
│ │ │ ├── clean_html.rb
│ │ │ └── entries.rb
│ │ ├── scrapers/
│ │ │ ├── angular.rb
│ │ │ ├── angularjs.rb
│ │ │ ├── ansible.rb
│ │ │ ├── apache.rb
│ │ │ ├── apache_pig.rb
│ │ │ ├── astro.rb
│ │ │ ├── async.rb
│ │ │ ├── axios.rb
│ │ │ ├── babel.rb
│ │ │ ├── backbone.rb
│ │ │ ├── bash.rb
│ │ │ ├── bazel.rb
│ │ │ ├── bluebird.rb
│ │ │ ├── bootstrap.rb
│ │ │ ├── bottle.rb
│ │ │ ├── bower.rb
│ │ │ ├── bun.rb
│ │ │ ├── cakephp.rb
│ │ │ ├── chai.rb
│ │ │ ├── chef.rb
│ │ │ ├── click.rb
│ │ │ ├── clojure.rb
│ │ │ ├── cmake.rb
│ │ │ ├── codeception.rb
│ │ │ ├── codeceptjs.rb
│ │ │ ├── codeigniter.rb
│ │ │ ├── coffeescript.rb
│ │ │ ├── composer.rb
│ │ │ ├── cordova.rb
│ │ │ ├── couchdb.rb
│ │ │ ├── cppref/
│ │ │ │ ├── c.rb
│ │ │ │ ├── cpp.rb
│ │ │ │ └── cppref.rb
│ │ │ ├── crystal.rb
│ │ │ ├── cypress.rb
│ │ │ ├── d.rb
│ │ │ ├── d3.rb
│ │ │ ├── dart.rb
│ │ │ ├── date_fns.rb
│ │ │ ├── deno.rb
│ │ │ ├── django.rb
│ │ │ ├── docker.rb
│ │ │ ├── dojo.rb
│ │ │ ├── drupal.rb
│ │ │ ├── duckdb.rb
│ │ │ ├── eigen3.rb
│ │ │ ├── electron.rb
│ │ │ ├── elisp.rb
│ │ │ ├── elixir.rb
│ │ │ ├── ember.rb
│ │ │ ├── enzyme.rb
│ │ │ ├── erlang.rb
│ │ │ ├── es_toolkit.rb
│ │ │ ├── esbuild.rb
│ │ │ ├── eslint.rb
│ │ │ ├── express.rb
│ │ │ ├── falcon.rb
│ │ │ ├── fastapi.rb
│ │ │ ├── fish.rb
│ │ │ ├── flask.rb
│ │ │ ├── flow.rb
│ │ │ ├── fluture.rb
│ │ │ ├── git.rb
│ │ │ ├── github.rb
│ │ │ ├── gnu/
│ │ │ │ ├── gcc.rb
│ │ │ │ └── gnu_fortran.rb
│ │ │ ├── gnu.rb
│ │ │ ├── gnu_cobol.rb
│ │ │ ├── gnu_make.rb
│ │ │ ├── gnuplot.rb
│ │ │ ├── go.rb
│ │ │ ├── godot.rb
│ │ │ ├── graphite.rb
│ │ │ ├── graphviz.rb
│ │ │ ├── groovy.rb
│ │ │ ├── grunt.rb
│ │ │ ├── gtk.rb
│ │ │ ├── hammerspoon.rb
│ │ │ ├── handlebars.rb
│ │ │ ├── hapi.rb
│ │ │ ├── haproxy.rb
│ │ │ ├── haskell.rb
│ │ │ ├── haxe.rb
│ │ │ ├── homebrew.rb
│ │ │ ├── htmx.rb
│ │ │ ├── http.rb
│ │ │ ├── i3.rb
│ │ │ ├── immutable.rb
│ │ │ ├── influxdata.rb
│ │ │ ├── jasmine.rb
│ │ │ ├── jekyll.rb
│ │ │ ├── jest.rb
│ │ │ ├── jinja.rb
│ │ │ ├── joi.rb
│ │ │ ├── jq.rb
│ │ │ ├── jquery/
│ │ │ │ ├── jquery.rb
│ │ │ │ ├── jquery_core.rb
│ │ │ │ ├── jquery_mobile.rb
│ │ │ │ └── jquery_ui.rb
│ │ │ ├── jsdoc.rb
│ │ │ ├── julia.rb
│ │ │ ├── knockout.rb
│ │ │ ├── koa.rb
│ │ │ ├── kotlin.rb
│ │ │ ├── kubectl.rb
│ │ │ ├── kubernetes.rb
│ │ │ ├── laravel.rb
│ │ │ ├── latex.rb
│ │ │ ├── leaflet.rb
│ │ │ ├── less.rb
│ │ │ ├── liquid.rb
│ │ │ ├── lit.rb
│ │ │ ├── lodash.rb
│ │ │ ├── love.rb
│ │ │ ├── lua.rb
│ │ │ ├── man.rb
│ │ │ ├── mariadb.rb
│ │ │ ├── marionette.rb
│ │ │ ├── markdown.rb
│ │ │ ├── matplotlib.rb
│ │ │ ├── mdn/
│ │ │ │ ├── css.rb
│ │ │ │ ├── dom.rb
│ │ │ │ ├── html.rb
│ │ │ │ ├── javascript.rb
│ │ │ │ ├── mdn.rb
│ │ │ │ ├── svg.rb
│ │ │ │ ├── web_extensions.rb
│ │ │ │ └── xslt_xpath.rb
│ │ │ ├── meteor.rb
│ │ │ ├── mkdocs/
│ │ │ │ ├── django_rest_framework.rb
│ │ │ │ └── mkdocs.rb
│ │ │ ├── mocha.rb
│ │ │ ├── modernizr.rb
│ │ │ ├── moment.rb
│ │ │ ├── moment_timezone.rb
│ │ │ ├── mongoose.rb
│ │ │ ├── nextjs.rb
│ │ │ ├── nginx.rb
│ │ │ ├── nginx_lua_module.rb
│ │ │ ├── nim.rb
│ │ │ ├── nix.rb
│ │ │ ├── node.rb
│ │ │ ├── nokogiri2.rb
│ │ │ ├── npm.rb
│ │ │ ├── numpy.rb
│ │ │ ├── nushell.rb
│ │ │ ├── ocaml.rb
│ │ │ ├── octave.rb
│ │ │ ├── opengl.rb
│ │ │ ├── openjdk.rb
│ │ │ ├── openlayers.rb
│ │ │ ├── opentsdb.rb
│ │ │ ├── padrino.rb
│ │ │ ├── pandas.rb
│ │ │ ├── perl.rb
│ │ │ ├── phalcon.rb
│ │ │ ├── phaser.rb
│ │ │ ├── phoenix.rb
│ │ │ ├── php.rb
│ │ │ ├── phpunit.rb
│ │ │ ├── playwright.rb
│ │ │ ├── point_cloud_library.rb
│ │ │ ├── pony.rb
│ │ │ ├── postgresql.rb
│ │ │ ├── prettier.rb
│ │ │ ├── pug.rb
│ │ │ ├── puppeteer.rb
│ │ │ ├── pygame.rb
│ │ │ ├── python.rb
│ │ │ ├── pytorch.rb
│ │ │ ├── q.rb
│ │ │ ├── qt.rb
│ │ │ ├── qunit.rb
│ │ │ ├── r.rb
│ │ │ ├── ramda.rb
│ │ │ ├── rdoc/
│ │ │ │ ├── minitest.rb
│ │ │ │ ├── rails.rb
│ │ │ │ ├── rdoc.rb
│ │ │ │ └── ruby.rb
│ │ │ ├── react.rb
│ │ │ ├── react_bootstrap.rb
│ │ │ ├── react_native.rb
│ │ │ ├── react_router.rb
│ │ │ ├── reactivex.rb
│ │ │ ├── redis.rb
│ │ │ ├── redux.rb
│ │ │ ├── relay.rb
│ │ │ ├── requests.rb
│ │ │ ├── requirejs.rb
│ │ │ ├── rethinkdb.rb
│ │ │ ├── rust.rb
│ │ │ ├── rxjs.rb
│ │ │ ├── salt_stack.rb
│ │ │ ├── sanctuary.rb
│ │ │ ├── sanctuary_def.rb
│ │ │ ├── sanctuary_type_classes.rb
│ │ │ ├── sass.rb
│ │ │ ├── scala.rb
│ │ │ ├── scikit_image.rb
│ │ │ ├── scikit_learn.rb
│ │ │ ├── sequelize.rb
│ │ │ ├── sinon.rb
│ │ │ ├── socketio.rb
│ │ │ ├── sphinx.rb
│ │ │ ├── spring_boot.rb
│ │ │ ├── sqlite.rb
│ │ │ ├── statsmodels.rb
│ │ │ ├── support_tables.rb
│ │ │ ├── svelte.rb
│ │ │ ├── symfony.rb
│ │ │ ├── tailwindcss.rb
│ │ │ ├── tcl_tk.rb
│ │ │ ├── tcllib.rb
│ │ │ ├── tensorflow/
│ │ │ │ ├── tensorflow.rb
│ │ │ │ └── tensorflow_cpp.rb
│ │ │ ├── terraform.rb
│ │ │ ├── threejs.rb
│ │ │ ├── trio.rb
│ │ │ ├── twig.rb
│ │ │ ├── typescript.rb
│ │ │ ├── underscore.rb
│ │ │ ├── vagrant.rb
│ │ │ ├── varnish.rb
│ │ │ ├── vertx.rb
│ │ │ ├── vite.rb
│ │ │ ├── vitest.rb
│ │ │ ├── vue.rb
│ │ │ ├── vue_router.rb
│ │ │ ├── vueuse.rb
│ │ │ ├── vuex.rb
│ │ │ ├── vulkan.rb
│ │ │ ├── wagtail.rb
│ │ │ ├── webpack.rb
│ │ │ ├── werkzeug.rb
│ │ │ ├── wordpress.rb
│ │ │ ├── yarn.rb
│ │ │ ├── yii.rb
│ │ │ ├── zig.rb
│ │ │ └── zsh.rb
│ │ ├── storage/
│ │ │ ├── abstract_store.rb
│ │ │ ├── file_store.rb
│ │ │ └── null_store.rb
│ │ └── subscribers/
│ │ ├── doc_subscriber.rb
│ │ ├── filter_subscriber.rb
│ │ ├── image_subscriber.rb
│ │ ├── progress_bar_subscriber.rb
│ │ ├── request_subscriber.rb
│ │ ├── requester_subscriber.rb
│ │ ├── scraper_subscriber.rb
│ │ └── store_subscriber.rb
│ ├── docs.rb
│ └── tasks/
│ ├── assets.thor
│ ├── console.thor
│ ├── docs.thor
│ ├── sprites.thor
│ ├── test.thor
│ └── updates.thor
├── newrelic.yml
├── public/
│ ├── 404.html
│ ├── 500.html
│ ├── favicon.pxm
│ ├── favicon@2x.pxm
│ ├── icons/
│ │ └── docs/
│ │ ├── angular/
│ │ │ └── SOURCE
│ │ ├── angularjs/
│ │ │ └── SOURCE
│ │ ├── ansible/
│ │ │ └── SOURCE
│ │ ├── apache_http_server/
│ │ │ └── SOURCE
│ │ ├── astro/
│ │ │ └── SOURCE
│ │ ├── async/
│ │ │ └── SOURCE
│ │ ├── axios/
│ │ │ └── SOURCE
│ │ ├── babel/
│ │ │ └── SOURCE
│ │ ├── backbone/
│ │ │ └── SOURCE
│ │ ├── bash/
│ │ │ └── SOURCE
│ │ ├── bazel/
│ │ │ └── SOURCE
│ │ ├── bluebird/
│ │ │ └── SOURCE
│ │ ├── bootstrap/
│ │ │ └── SOURCE
│ │ ├── bottle/
│ │ │ └── SOURCE
│ │ ├── bower/
│ │ │ └── SOURCE
│ │ ├── bun/
│ │ │ └── SOURCE
│ │ ├── c/
│ │ │ └── SOURCE
│ │ ├── cakephp/
│ │ │ └── SOURCE
│ │ ├── chai/
│ │ │ └── SOURCE
│ │ ├── chef/
│ │ │ └── SOURCE
│ │ ├── click/
│ │ │ └── SOURCE
│ │ ├── clojure/
│ │ │ └── SOURCE
│ │ ├── cmake/
│ │ │ └── SOURCE
│ │ ├── codeception/
│ │ │ └── SOURCE
│ │ ├── codeceptjs/
│ │ │ └── SOURCE
│ │ ├── codeigniter/
│ │ │ └── SOURCE
│ │ ├── coffeescript/
│ │ │ └── SOURCE
│ │ ├── composer/
│ │ │ └── SOURCE
│ │ ├── cordova/
│ │ │ └── SOURCE
│ │ ├── couchdb/
│ │ │ └── SOURCE
│ │ ├── cpp/
│ │ │ └── SOURCE
│ │ ├── crystal/
│ │ │ └── SOURCE
│ │ ├── css/
│ │ │ └── SOURCE
│ │ ├── cypress/
│ │ │ └── SOURCE
│ │ ├── d/
│ │ │ └── SOURCE
│ │ ├── d3/
│ │ │ └── SOURCE
│ │ ├── dart/
│ │ │ └── SOURCE
│ │ ├── date_fns/
│ │ │ └── SOURCE
│ │ ├── deno/
│ │ │ └── SOURCE
│ │ ├── django/
│ │ │ └── SOURCE
│ │ ├── django_rest_framework/
│ │ │ └── SOURCE
│ │ ├── docker/
│ │ │ └── SOURCE
│ │ ├── dom/
│ │ │ └── DOM.sketch/
│ │ │ ├── Data
│ │ │ ├── fonts
│ │ │ └── version
│ │ ├── dom_events/
│ │ │ └── DOM_events.sketch/
│ │ │ ├── Data
│ │ │ ├── fonts
│ │ │ └── version
│ │ ├── drupal/
│ │ │ └── SOURCE
│ │ ├── duckdb/
│ │ │ └── SOURCE
│ │ ├── eigen3/
│ │ │ └── SOURCE
│ │ ├── electron/
│ │ │ └── SOURCE
│ │ ├── elisp/
│ │ │ └── SOURCE
│ │ ├── elixir/
│ │ │ └── SOURCE
│ │ ├── ember/
│ │ │ └── SOURCE
│ │ ├── erlang/
│ │ │ └── SOURCE
│ │ ├── es_toolkit/
│ │ │ └── SOURCE
│ │ ├── esbuild/
│ │ │ └── SOURCE
│ │ ├── eslint/
│ │ │ └── SOURCE
│ │ ├── express/
│ │ │ ├── 16.pxm
│ │ │ └── 16@2x.pxm
│ │ ├── falcon/
│ │ │ └── SOURCE
│ │ ├── fastapi/
│ │ │ └── SOURCE
│ │ ├── fish/
│ │ │ └── SOURCE
│ │ ├── flask/
│ │ │ └── SOURCE
│ │ ├── flow/
│ │ │ └── SOURCE
│ │ ├── fluture/
│ │ │ └── SOURCE
│ │ ├── git/
│ │ │ └── SOURCE
│ │ ├── gnu_cobol/
│ │ │ └── SOURCE
│ │ ├── gnu_fortran/
│ │ │ └── SOURCE
│ │ ├── gnu_make/
│ │ │ └── SOURCE
│ │ ├── gnuplot/
│ │ │ └── SOURCE
│ │ ├── go/
│ │ │ └── SOURCE
│ │ ├── godot/
│ │ │ └── SOURCE
│ │ ├── graphviz/
│ │ │ └── SOURCE
│ │ ├── groovy/
│ │ │ └── SOURCE
│ │ ├── grunt/
│ │ │ └── SOURCE
│ │ ├── gtk/
│ │ │ └── SOURCE
│ │ ├── hammerspoon/
│ │ │ └── SOURCE
│ │ ├── handlebars/
│ │ │ └── SOURCE
│ │ ├── hapi/
│ │ │ └── SOURCE
│ │ ├── haproxy/
│ │ │ └── SOURCE
│ │ ├── haskell/
│ │ │ └── SOURCE
│ │ ├── haxe/
│ │ │ └── SOURCE
│ │ ├── homebrew/
│ │ │ └── SOURCE
│ │ ├── html/
│ │ │ ├── HTML5.sketch/
│ │ │ │ ├── Data
│ │ │ │ ├── fonts
│ │ │ │ └── version
│ │ │ └── SOURCE
│ │ ├── htmx/
│ │ │ └── SOURCE
│ │ ├── http/
│ │ │ ├── 16.pxm
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── i3/
│ │ │ └── SOURCE
│ │ ├── immutable/
│ │ │ └── SOURCE
│ │ ├── jasmine/
│ │ │ └── SOURCE
│ │ ├── javascript/
│ │ │ ├── 16.pxm
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── jekyll/
│ │ │ └── SOURCE
│ │ ├── jest/
│ │ │ └── SOURCE
│ │ ├── jinja/
│ │ │ └── SOURCE
│ │ ├── joi/
│ │ │ └── SOURCE
│ │ ├── jq/
│ │ │ └── SOURCE
│ │ ├── jquery/
│ │ │ └── SOURCE
│ │ ├── jquerymobile/
│ │ │ └── SOURCE
│ │ ├── jqueryui/
│ │ │ └── SOURCE
│ │ ├── julia/
│ │ │ └── SOURCE
│ │ ├── knockout/
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── kotlin/
│ │ │ └── SOURCE
│ │ ├── kubectl/
│ │ │ └── SOURCE
│ │ ├── kubernetes/
│ │ │ └── SOURCE
│ │ ├── laravel/
│ │ │ └── SOURCE
│ │ ├── latex/
│ │ │ └── SOURCE
│ │ ├── leaflet/
│ │ │ └── SOURCE
│ │ ├── less/
│ │ │ └── less.pxm
│ │ ├── lit/
│ │ │ └── SOURCE
│ │ ├── lodash/
│ │ │ └── SOURCE
│ │ ├── love/
│ │ │ └── SOURCE
│ │ ├── lua/
│ │ │ └── SOURCE
│ │ ├── man/
│ │ │ └── SOURCE
│ │ ├── mariadb/
│ │ │ └── SOURCE
│ │ ├── marionette/
│ │ │ └── SOURCE
│ │ ├── markdown/
│ │ │ └── SOURCE
│ │ ├── matplotlib/
│ │ │ └── SOURCE
│ │ ├── meteor/
│ │ │ └── SOURCE
│ │ ├── minitest/
│ │ │ └── SOURCE
│ │ ├── mocha/
│ │ │ └── SOURCE
│ │ ├── modernizr/
│ │ │ └── SOURCE
│ │ ├── moment/
│ │ │ └── moment.sketch/
│ │ │ ├── Data
│ │ │ ├── fonts
│ │ │ ├── metadata
│ │ │ └── version
│ │ ├── moment_timezone/
│ │ │ └── SOURCE
│ │ ├── nextjs/
│ │ │ └── SOURCE
│ │ ├── nginx/
│ │ │ └── SOURCE
│ │ ├── nim/
│ │ │ └── SOURCE
│ │ ├── nix/
│ │ │ └── SOURCE
│ │ ├── node/
│ │ │ └── SOURCE
│ │ ├── nokogiri/
│ │ │ └── icon.pxm
│ │ ├── npm/
│ │ │ └── SOURCE
│ │ ├── numpy/
│ │ │ └── SOURCE
│ │ ├── nushell/
│ │ │ └── SOURCE
│ │ ├── ocaml/
│ │ │ └── SOURCE
│ │ ├── octave/
│ │ │ └── SOURCE
│ │ ├── opengl/
│ │ │ └── SOURCE
│ │ ├── openlayers/
│ │ │ └── SOURCE
│ │ ├── padrino/
│ │ │ └── SOURCE
│ │ ├── pandas/
│ │ │ └── SOURCE
│ │ ├── perl/
│ │ │ └── SOURCE
│ │ ├── phalcon/
│ │ │ └── SOURCE
│ │ ├── phaser/
│ │ │ └── SOURCE
│ │ ├── phoenix/
│ │ │ └── SOURCE
│ │ ├── php/
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── phpunit/
│ │ │ └── SOURCE
│ │ ├── playwright/
│ │ │ └── SOURCE
│ │ ├── point_cloud_library/
│ │ │ └── SOURCE
│ │ ├── pony/
│ │ │ └── SOURCE
│ │ ├── postgresql/
│ │ │ └── SOURCE
│ │ ├── prettier/
│ │ │ └── SOURCE
│ │ ├── pug/
│ │ │ └── SOURCE
│ │ ├── puppeteer/
│ │ │ └── SOURCE
│ │ ├── pygame/
│ │ │ └── SOURCE
│ │ ├── python/
│ │ │ └── SOURCE
│ │ ├── pytorch/
│ │ │ └── SOURCE
│ │ ├── q/
│ │ │ └── SOURCE
│ │ ├── qt/
│ │ │ └── SOURCE
│ │ ├── qunit/
│ │ │ └── SOURCE
│ │ ├── r/
│ │ │ └── SOURCE
│ │ ├── rails/
│ │ │ ├── SOURCE
│ │ │ └── rails.pxm
│ │ ├── ramda/
│ │ │ └── SOURCE
│ │ ├── react/
│ │ │ └── SOURCE
│ │ ├── react_bootstrap/
│ │ │ └── SOURCE
│ │ ├── react_native/
│ │ │ └── SOURCE
│ │ ├── react_router/
│ │ │ └── SOURCE
│ │ ├── reactivex/
│ │ │ └── SOURCE
│ │ ├── redis/
│ │ │ └── SOURCE
│ │ ├── redux/
│ │ │ └── SOURCE
│ │ ├── requests/
│ │ │ └── SOURCE
│ │ ├── requirejs/
│ │ │ └── SOURCE
│ │ ├── rethinkdb/
│ │ │ └── SOURCE
│ │ ├── ruby/
│ │ │ └── SOURCE
│ │ ├── rust/
│ │ │ └── SOURCE
│ │ ├── rxjs/
│ │ │ └── SOURCE
│ │ ├── saltstack/
│ │ │ └── SOURCE
│ │ ├── sanctuary/
│ │ │ └── SOURCE
│ │ ├── sanctuary_def/
│ │ │ └── SOURCE
│ │ ├── sanctuary_type_classes/
│ │ │ └── SOURCE
│ │ ├── sass/
│ │ │ ├── SOURCE
│ │ │ └── sass.pxm
│ │ ├── scikit_image/
│ │ │ └── SOURCE
│ │ ├── scikit_learn/
│ │ │ └── SOURCE
│ │ ├── sequelize/
│ │ │ └── SOURCE
│ │ ├── sinon/
│ │ │ └── SOURCE
│ │ ├── socketio/
│ │ │ └── SOURCE
│ │ ├── spring_boot/
│ │ │ └── SOURCE
│ │ ├── sqlite/
│ │ │ └── SOURCE
│ │ ├── statsmodels/
│ │ │ └── SOURCE
│ │ ├── support_tables/
│ │ │ └── SOURCE
│ │ ├── svelte/
│ │ │ └── SOURCE
│ │ ├── svg/
│ │ │ └── SOURCE
│ │ ├── symfony/
│ │ │ └── SOURCE
│ │ ├── tailwindcss/
│ │ │ └── SOURCE
│ │ ├── tcl_tk/
│ │ │ └── SOURCE
│ │ ├── tcllib/
│ │ │ └── SOURCE
│ │ ├── tensorflow/
│ │ │ └── SOURCE
│ │ ├── tensorflow_cpp/
│ │ │ └── SOURCE
│ │ ├── terraform/
│ │ │ └── SOURCE
│ │ ├── threejs/
│ │ │ └── SOURCE
│ │ ├── trio/
│ │ │ └── SOURCE
│ │ ├── twig/
│ │ │ └── SOURCE
│ │ ├── typescript/
│ │ │ └── SOURCE
│ │ ├── underscore/
│ │ │ └── SOURCE
│ │ ├── vagrant/
│ │ │ └── SOURCE
│ │ ├── varnish/
│ │ │ └── SOURCE
│ │ ├── vertx/
│ │ │ └── SOURCE
│ │ ├── vite/
│ │ │ └── SOURCE
│ │ ├── vitest/
│ │ │ └── SOURCE
│ │ ├── vue/
│ │ │ └── SOURCE
│ │ ├── vue_router/
│ │ │ └── SOURCE
│ │ ├── vueuse/
│ │ │ └── SOURCE
│ │ ├── vuex/
│ │ │ └── SOURCE
│ │ ├── vulkan/
│ │ │ └── SOURCE
│ │ ├── wagtail/
│ │ │ └── SOURCE
│ │ ├── webpack/
│ │ │ └── SOURCE
│ │ ├── werkzeug/
│ │ │ └── SOURCE
│ │ ├── wordpress/
│ │ │ └── SOURCE
│ │ ├── xpath/
│ │ │ └── XPath.sketch/
│ │ │ ├── Data
│ │ │ ├── metadata
│ │ │ └── version
│ │ ├── yarn/
│ │ │ └── SOURCE
│ │ ├── yii/
│ │ │ └── SOURCE
│ │ ├── zig/
│ │ │ └── SOURCE
│ │ └── zsh/
│ │ └── SOURCE
│ ├── images/
│ │ ├── apple-icon.pxm
│ │ ├── fluid-icon.pxm
│ │ ├── icon.pxm
│ │ └── webapp-icon-small.pxm
│ ├── manifest.json
│ ├── mathml.css
│ ├── opensearch.xml
│ └── robots.txt
├── renovate.json
├── techstack.md
├── techstack.yml
├── test/
│ ├── app_test.rb
│ ├── files/
│ │ └── docs.json
│ ├── lib/
│ │ └── docs/
│ │ ├── core/
│ │ │ ├── doc_test.rb
│ │ │ ├── entry_index_test.rb
│ │ │ ├── filter_test.rb
│ │ │ ├── instrumentable_test.rb
│ │ │ ├── manifest_test.rb
│ │ │ ├── models/
│ │ │ │ ├── entry_test.rb
│ │ │ │ └── type_test.rb
│ │ │ ├── parser_test.rb
│ │ │ ├── request_test.rb
│ │ │ ├── requester_test.rb
│ │ │ ├── response_test.rb
│ │ │ ├── scraper_test.rb
│ │ │ ├── scrapers/
│ │ │ │ ├── file_scraper_test.rb
│ │ │ │ └── url_scraper_test.rb
│ │ │ └── url_test.rb
│ │ ├── filters/
│ │ │ └── core/
│ │ │ ├── apply_base_url_test.rb
│ │ │ ├── clean_html_test.rb
│ │ │ ├── clean_text_test.rb
│ │ │ ├── container_test.rb
│ │ │ ├── entries_test.rb
│ │ │ ├── inner_html_test.rb
│ │ │ ├── internal_urls_test.rb
│ │ │ ├── normalize_paths_test.rb
│ │ │ ├── normalize_urls_test.rb
│ │ │ ├── parse_cf_email_test.rb
│ │ │ └── title_test.rb
│ │ └── storage/
│ │ ├── abstract_store_test.rb
│ │ └── file_store_test.rb
│ ├── support/
│ │ ├── fake_instrumentation.rb
│ │ └── filter_test_helper.rb
│ └── test_helper.rb
└── views/
├── app.erb
├── index.erb
├── other.erb
├── service-worker.js.erb
└── unsupported.erb
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
.git
test
Dockerfile*
.gitignore
.dockerignore
.travis.yml
*.md
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
================================================
FILE: .github/CODEOWNERS
================================================
# This controls who gets notified for review and allows branches to be protected.
# Protected branches can only be merged into after being approved by a codeowner.
* @freeCodeCamp/devdocs
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing to DevDocs
Want to contribute? Great. Please review the following guidelines carefully and search for existing issues before opening a new one.
**Table of Contents:**
1. [Reporting bugs](#reporting-bugs)
2. [Requesting new features](#requesting-new-features)
3. [Requesting new documentations](#requesting-new-documentations)
4. [Contributing code and features](#contributing-code-and-features)
5. [Contributing new documentations](#contributing-new-documentations)
6. [Updating existing documentations](#updating-existing-documentations)
7. [Coding conventions](#coding-conventions)
8. [Questions?](#questions)
## Reporting bugs
1. Update to the most recent main release; the bug may already be fixed.
2. Search for existing issues; it's possible someone has already encountered this bug.
3. Try to isolate the problem and include steps to reproduce it.
4. Share as much information as possible (e.g. browser/OS environment, log output, stack trace, screenshots, etc.).
## Requesting new features
1. Search for similar feature requests; someone may have already requested it.
2. Make sure your feature fits DevDocs's [vision](../README.md#vision).
3. Provide a clear and detailed explanation of the feature and why it's important to add it.
## Requesting new documentations
Please don't open issues to request new documentations.
Use the [Trello board](https://trello.com/b/6BmTulfx/devdocs-documentation) where everyone can vote.
## Contributing code and features
1. Search for existing issues; someone may already be working on a similar feature.
2. Before embarking on any significant pull request, please open an issue describing the changes you intend to make. Otherwise you risk spending a lot of time working on something we may not want to merge. This also tells other contributors that you're working on the feature.
3. Follow the [coding conventions](#coding-conventions).
4. If you're modifying the Ruby code, include tests and ensure they pass.
5. Try to keep your pull request small and simple.
6. When it makes sense, squash your commits into a single commit.
7. Describe all your changes in the commit message and/or pull request.
## Contributing new documentations
See the [`docs` folder](https://github.com/freeCodeCamp/devdocs/tree/main/docs) to learn how to add new documentations.
**Important:** the documentation's license must permit alteration, redistribution and commercial use, and the documented software must be released under an open source license. Feel free to get in touch if you're not sure if a documentation meets those requirements.
In addition to the [guidelines for contributing code](#contributing-code-and-features), the following guidelines apply to pull requests that add a new documentation:
* Your documentation must come with an official icon, in both 1x and 2x resolutions (16x16 and 32x32 pixels). This is important because icons are the only thing differentiating search results in the UI.
* DevDocs favors quality over quantity. Your documentation should only include documents that most developers may want to read semi-regularly. By reducing the number of entries, we make it easier to find other, more relevant entries.
* Remove as much content and HTML markup as possible, particularly content not associated with any entry (e.g. introduction, changelog, etc.).
* Names must be as short as possible and unique across the documentation.
* The number of types (categories) should ideally be less than 100.
## Updating existing documentations
If the latest [documentation versions report](https://github.com/freeCodeCamp/devdocs/issues?utf8=%E2%9C%93&q=Documentation+versions+report+is%3Aissue+author%3Adevdocs-bot+sort%3Acreated-desc) wrongly shows a documentation to be up-to-date, please open an issue or a PR to fix it.
**Important:** PR's that update documentation versions that do not contain the checklist shown to you in section B of the PR template may be closed without review.
Follow the following steps to update documentations to their latest version:
1. Make version/release changes in the scraper file.
2. Check if the license is still correct. Update `options[:attribution]` if needed.
3. If the documentation has a custom icon, ensure the icons in <code>public/icons/*your_scraper_name*/</code> are up-to-date. If you pull the updated icon from a place different than the one specified in the `SOURCE` file, make sure to replace the old link with the new one.
4. If `self.links` is defined, check if the urls are still correct.
5. If the scraper inherits from `FileScraper` rather than `URLScraper`, follow the instructions for that scraper in [`file-scrapers.md`](../docs/file-scrapers.md) to obtain the source material for the scraper.
6. Generate the docs using `thor docs:generate <doc@version>`.
7. Make sure `thor docs:generate` doesn't show errors and that the documentation still works well. Verify locally that everything works and that the categorization of entries is still good. Often, updates will require code changes in the scraper or its filters to tweak some new markup in the source website or to categorize new entries.
8. Repeat steps 5 and 6 for all versions that you updated.
9. Create a PR and make sure to fill the checklist in section B of the PR template (remove the other sections).
## Coding conventions
* two spaces; no tabs
* no trailing whitespace; blank lines should have no spaces; new line at end-of-file
* use the same coding style as the rest of the codebase
These conventions are formalized in [our `.editorconfig` file](../.editorconfig).
Check out [EditorConfig.org](https://editorconfig.org/) to learn how to make your tools adhere to it.
## Questions?
If you have any questions, please feel free to ask them on the contributor chat room on [Discord](https://discord.gg/PRyKn3Vbay).
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve DevDocs
title: ''
labels: 'bug'
assignees: ''
---
<!--
If possible fill each section
-->
# Bug report
<!--
Verify this steps before writing a new issue:
- Search for existing issues; it's possible someone has already encountered this bug.
-->
## OS information
<!--
What operating system and browser version are you using?
-->
## Steps to reproduce
<!--
Write the steps to reproduce this bug or write a description about when and how you
encountered it
-->
## More resources
<!--
Add images, GIFs, screenshot, console output or any other resource that might help to understand this bug
-->
## Possible fix
<!--
If you have an idea how to fix this you can write here
-->
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Question
about: "Ask questions and have discussions on Discord"
url: "https://discord.gg/PRyKn3Vbay"
- name: New Documentation
about: "Request a new documentation on Trello"
url: "https://trello.com/b/6BmTulfx/devdocs-documentation"
================================================
FILE: .github/ISSUE_TEMPLATE/documentation_bug.md
================================================
---
name: Documentation bug
about: Report a problem with a specific documentation
title: ''
labels: 'docs/improvement'
assignees: ''
---
<!--
If possible fill each section
-->
# Documentation style bug
<!--
- Search for existing issues
https://github.com/freeCodeCamp/devdocs/labels/docs%2Fimprovement
-->
## Summary
<!--
Add a description about how the documentation should be
-->
## Actual style
<!--
Add images or urls of the miss-formatted DevDocs documentation
-->
## Expected style
<!--
Add images showing the expected style or urls of the source page
-->
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest a new feature
title: ''
labels: 'feature'
assignees: ''
---
<!--
If possible fill each section
-->
# Feature request
<!--
Verify this steps before suggesting a new feature:
- Check if anyone has suggested this feature before
https://github.com/freeCodeCamp/devdocs/labels/feature
- Make sure your feature fits DevDocs' vision
https://github.com/freeCodeCamp/devdocs/blob/main/README.md#vision
-->
## Summary
<!--
Write a description of this feature and write why it should be added to DevDocs
-->
## Examples
<!--
If you have seen this feature before you can add images, URLs, GIFs and any other
resource that might help to understand how this feature works
-->
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- Remove the sections that don't apply to your PR. -->
<!-- Replace the `[ ]` with a `[x]` in checklists once you’ve completed each step. -->
<!-- Please create a draft PR when you haven't completed all steps yet upon creation of the PR. -->
<!-- SECTION A - Adding a new scraper -->
<!-- See https://github.com/freeCodeCamp/devdocs/blob/main/.github/CONTRIBUTING.md#contributing-new-documentations -->
If you’re adding a new scraper, please ensure that you have:
- [ ] Tested the scraper on a local copy of DevDocs
- [ ] Ensured that the docs are styled similarly to other docs on DevDocs
<!-- If the docs don’t have an icon, delete the next four items: -->
- [ ] Added these files to the <code>public/icons/*your_scraper_name*/</code> directory:
- [ ] `16.png`: a 16×16 pixel icon for the doc
- [ ] `16@2x.png`: a 32×32 pixel icon for the doc
- [ ] `SOURCE`: A text file containing the URL to the page the image can be found on or the URL of the original image itself
<!-- SECTION B - Updating an existing documentation to its latest version -->
<!-- See https://github.com/freeCodeCamp/devdocs/blob/main/.github/CONTRIBUTING.md#updating-existing-documentations -->
If you're updating existing documentation to its latest version, please ensure that you have:
- [ ] Updated the versions and releases in the scraper file
- [ ] Ensured the license is up-to-date
- [ ] Ensured the icons and the `SOURCE` file in <code>public/icons/*your_scraper_name*/</code> are up-to-date if the documentation has a custom icon
- [ ] Ensured `self.links` contains up-to-date urls if `self.links` is defined
- [ ] Tested the changes locally to ensure:
- The scraper still works without errors
- The scraped documentation still looks consistent with the rest of DevDocs
- The categorization of entries is still good
================================================
FILE: .github/no-response.yml
================================================
daysUntilClose: 30
responseRequiredLabel: needs-info
closeComment: >
This issue has been automatically closed because there has been no response
to our request for more information from the original author. With only the
information that’s currently in the issue, we don’t have enough information
to take action. Please comment if you have or find the answer we need so we
can investigate further.
================================================
FILE: .github/workflows/build.yml
================================================
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
name: Deploy to Heroku
runs-on: ubuntu-24.04
if: github.repository == 'freeCodeCamp/devdocs'
steps:
- uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
- name: Set up Ruby
uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Run tests
run: bundle exec rake
- name: Install Heroku CLI
run: |
curl https://cli-assets.heroku.com/install.sh | sh
- name: Deploy to Heroku
uses: akhileshns/heroku-deploy@e3eb99d45a8e2ec5dca08735e089607befa4bf28 # v3.14.15
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "devdocs"
heroku_email: "team@freecodecamp.com"
dontuseforce: true # --force should never be necessary
dontautocreate: true # The app exists, it should not be created
================================================
FILE: .github/workflows/docker-build.yml
================================================
name: Build and Push Docker Images
on:
schedule:
- cron: '0 0 1 * *' # Run monthly on the 1st
workflow_dispatch: # Allow manual triggers
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
strategy:
matrix:
variant:
- name: regular
file: Dockerfile
suffix: ''
- name: alpine
file: Dockerfile-alpine
suffix: '-alpine'
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
persist-credentials: false
- name: Log in to the Container registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata for Docker
id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=latest${{ matrix.variant.suffix }}
type=raw,value={{date 'YYYYMMDD'}}${{ matrix.variant.suffix }}
- name: Build and push image
uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5
with:
context: .
file: ./${{ matrix.variant.file }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
================================================
FILE: .github/workflows/schedule-doc-report.yml
================================================
name: Generate documentation versions report
on:
schedule:
- cron: '17 4 1 * *'
workflow_dispatch:
jobs:
report:
runs-on: ubuntu-24.04
if: github.repository == 'freeCodeCamp/devdocs'
steps:
- uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
- name: Set up Ruby
uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Generate report
run: bundle exec thor updates:check --github-token ${{ secrets.DEVDOCS_BOT_PAT }} --upload
================================================
FILE: .github/workflows/test.yml
================================================
name: Ruby tests
on:
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Set up Ruby
uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Run tests
run: bundle exec rake
================================================
FILE: .gitignore
================================================
.DS_Store
.bundle
log
tmp
public/assets
public/fonts
public/docs/**/*
docs/**/*
!docs/*.md
/vendor
*.tar
*.tar.bz2
*.tar.gz
*.zip
assets/stylesheets/components/_environment.scss
assets/stylesheets/global/_icons.scss
================================================
FILE: .image_optim.yml
================================================
verbose: false
skip_missing_workers: true
allow_lossy: true
threads: 1
advpng: false
gifsicle:
interlace: false
level: 3
careful: true
jhead: false
jpegoptim:
strip: all
max_quality: 100
jpegrecompress: false
jpegtran: false
optipng: false
pngcrush: false
pngout: false
pngquant:
quality: !ruby/range 80..99
speed: 3
svgo: false
================================================
FILE: .ruby-version
================================================
3.4.8
================================================
FILE: .slugignore
================================================
test
================================================
FILE: .tool-versions
================================================
ruby 3.4.8
================================================
FILE: COPYRIGHT
================================================
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
file, You can obtain one at http://mozilla.org/MPL/2.0/.
Please do not use the name DevDocs to endorse or promote products
derived from this software without the maintainers' permission, except
as may be necessary to comply with the notice/attribution requirements.
We also wish that any documentation file generated using this software
be attributed to DevDocs. Let's be fair to all contributors by giving
credit where credit's due. Thanks.
================================================
FILE: Dockerfile
================================================
FROM ruby:3.4.7
ENV LANG=C.UTF-8
ENV ENABLE_SERVICE_WORKER=true
WORKDIR /devdocs
RUN apt-get update && \
apt-get -y install git nodejs libcurl4 && \
gem install bundler && \
rm -rf /var/lib/apt/lists/*
COPY Gemfile Gemfile.lock Rakefile /devdocs/
RUN bundle config set path.system true && \
bundle install && \
rm -rf ~/.gem /root/.bundle/cache /usr/local/bundle/cache
COPY . /devdocs
RUN thor docs:download --all && \
thor assets:compile && \
rm -rf /tmp
EXPOSE 9292
CMD rackup -o 0.0.0.0
================================================
FILE: Dockerfile-alpine
================================================
FROM ruby:3.4.7-alpine
ENV LANG=C.UTF-8
ENV ENABLE_SERVICE_WORKER=true
WORKDIR /devdocs
COPY . /devdocs
RUN apk --update add nodejs build-base libstdc++ gzip git zlib-dev libcurl && \
gem install bundler && \
bundle config set path.system true && \
bundle config set without 'test' && \
bundle install && \
thor docs:download --all && \
thor assets:compile && \
apk del gzip build-base git zlib-dev && \
rm -rf /var/cache/apk/* /tmp ~/.gem /root/.bundle/cache \
/usr/local/bundle/cache /usr/lib/node_modules
EXPOSE 9292
CMD rackup -o 0.0.0.0
================================================
FILE: Gemfile
================================================
source 'https://rubygems.org'
ruby '3.4.8'
gem 'activesupport', require: false
gem 'html-pipeline'
gem 'nokogiri'
gem 'pry-byebug'
gem 'rake'
gem 'terminal-table'
gem 'thor'
gem 'typhoeus'
gem 'yajl-ruby', require: false
group :app do
gem 'browser'
gem 'chunky_png'
gem 'erubi'
gem 'dartsass-sprockets'
gem 'image_optim_pack', platforms: :ruby
gem 'image_optim'
gem 'rack-ssl-enforcer'
gem 'rack'
gem 'rss'
gem 'sinatra-contrib'
gem 'sinatra'
gem 'sprockets-helpers'
gem 'sprockets'
gem 'thin'
end
group :production do
gem 'newrelic_rpm'
gem "terser"
end
group :development do
gem 'better_errors'
end
group :docs do
gem 'progress_bar', require: false
gem 'redcarpet'
gem 'tty-pager', require: false
gem 'unix_utils', require: false
end
group :test do
gem 'minitest'
gem 'rack-test', require: false
gem 'rr', require: false
end
if ENV['SELENIUM'] == '1'
gem 'capybara'
gem 'selenium-webdriver'
end
================================================
FILE: LICENSE
================================================
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
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
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
================================================
FILE: Procfile
================================================
web: bundle exec rackup config.ru -p $PORT
================================================
FILE: README.md
================================================
# [DevDocs](https://devdocs.io) — API Documentation Browser
DevDocs combines multiple developer documentations in a clean and organized web UI with instant search, offline support, mobile version, dark theme, keyboard shortcuts, and more.
DevDocs was created by [Thibaut Courouble](https://thibaut.me) and is operated by [freeCodeCamp](https://www.freecodecamp.org).
## We are currently searching for maintainers
Please reach out to the community on [Discord](https://discord.gg/PRyKn3Vbay) if you would like to join the team!
Keep track of development news:
* Join the `#contributors` chat room on [Discord](https://discord.gg/PRyKn3Vbay)
* Watch the repository on [GitHub](https://github.com/freeCodeCamp/devdocs/subscription)
* Follow [@DevDocs](https://twitter.com/DevDocs) on Twitter
**Table of Contents:** [Quick Start](#quick-start) · [Vision](#vision) · [App](#app) · [Scraper](#scraper) · [Commands](#available-commands) · [Contributing](#contributing) · [Documentation](#documentation) · [Related Projects](#related-projects) · [License](#copyright--license) · [Questions?](#questions)
## Quick Start
Unless you wish to contribute to the project, we recommend using the hosted version at [devdocs.io](https://devdocs.io). It's up-to-date and works offline out-of-the-box.
### Using Docker (Recommended)
The easiest way to run DevDocs locally is using Docker:
```sh
docker run --name devdocs -d -p 9292:9292 ghcr.io/freecodecamp/devdocs:latest
```
This will start DevDocs at [localhost:9292](http://localhost:9292). We provide both regular and Alpine-based images:
- `ghcr.io/freecodecamp/devdocs:latest` - Standard image
- `ghcr.io/freecodecamp/devdocs:latest-alpine` - Alpine-based (smaller size)
Images are automatically built and updated monthly with the latest documentation.
Alternatively, you can build the image yourself:
```sh
git clone https://github.com/freeCodeCamp/devdocs.git && cd devdocs
docker build -t devdocs .
docker run --name devdocs -d -p 9292:9292 devdocs
```
### Manual Installation
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.4.1 (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). On Arch Linux run `pacman -S ruby ruby-bundler ruby-erb ruby-irb`.
Once you have these installed, run the following commands:
```sh
git clone https://github.com/freeCodeCamp/devdocs.git && cd devdocs
gem install bundler
bundle install
bundle exec thor docs:download --default
bundle exec rackup
```
Finally, point your browser at [localhost:9292](http://localhost:9292) (the first request will take a few seconds to compile the assets). You're all set.
The `thor docs:download` command is used to download pre-generated documentations from DevDocs's servers (e.g. `thor docs:download html css`). You can see the list of available documentations and versions by running `thor docs:list`. To update all downloaded documentations, run `thor docs:download --installed`. To download and install all documentation this project has available, run `thor docs:download --all`.
**Note:** there is currently no update mechanism other than `git pull origin main` to update the code and `thor docs:download --installed` to download the latest version of the docs. To stay informed about new releases, be sure to [watch](https://github.com/freeCodeCamp/devdocs/subscription) this repository.
## Vision
DevDocs aims to make reading and searching reference documentation fast, easy and enjoyable.
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
* Be fully functional offline
* Support full keyboard navigation
* Reduce “context switch” by using a consistent typography and design across all documentations
* Reduce clutter by focusing on a specific category of content (API/reference) and indexing only the minimum useful to most developers.
**Note:** DevDocs is neither a programming guide nor a search engine. All our content is pulled from third-party sources and the project doesn't intend to compete with full-text search engines. Its backbone is metadata; each piece of content is identified by a unique, "obvious" and short string. Tutorials, guides and other content that don't meet this requirement are outside the scope of the project.
## App
The web app is all client-side JavaScript, powered by a small [Sinatra](http://www.sinatrarb.com)/[Sprockets](https://github.com/rails/sprockets) application. It relies on files generated by the [scraper](#scraper).
Many of the code's design decisions were driven by the fact that the app uses XHR to load content directly into the main frame. This includes stripping the original documents of most of their HTML markup (e.g. scripts and stylesheets) to avoid polluting the main frame, and prefixing all CSS class names with an underscore to prevent conflicts.
Another driving factor is performance and the fact that everything happens in the browser. A service worker (which comes with its own set of constraints) and `localStorage` are used to speed up the boot time, while memory consumption is kept in check by allowing the user to pick his/her own set of documentations. The search algorithm is kept simple because it needs to be fast even searching through 100,000 strings.
DevDocs being a developer tool, the browser requirements are high:
* Recent versions of Firefox, Chrome, or Opera
* Safari 11.1+
* Edge 17+
* iOS 11.3+
This allows the code to take advantage of the latest DOM and HTML5 APIs and make developing DevDocs a lot more fun!
## Scraper
The scraper is responsible for generating the documentation and index files (metadata) used by the [app](#app). It's written in Ruby under the `Docs` module.
There are currently two kinds of scrapers: `UrlScraper` which downloads files via HTTP and `FileScraper` which reads them from the local filesystem. They both make copies of HTML documents, recursively following links that match a set of rules and applying all sorts of modifications along the way, in addition to building an index of the files and their metadata. Documents are parsed using [Nokogiri](http://nokogiri.org).
Modifications made to each document include:
* removing content such as the document structure (`<html>`, `<head>`, etc.), comments, empty nodes, etc.
* fixing links (e.g. to remove duplicates)
* replacing all external (not scraped) URLs with their fully qualified counterpart
* replacing all internal (scraped) URLs with their unqualified and relative counterpart
* adding content, such as a title and link to the original document
* ensuring correct syntax highlighting using [Prism](http://prismjs.com/)
These modifications are applied via a set of filters using the [HTML::Pipeline](https://github.com/jch/html-pipeline) library. Each scraper includes filters specific to itself, one of which is tasked with figuring out the pages' metadata.
The end result is a set of normalized HTML partials and two JSON files (index + offline data). Because the index files are loaded separately by the [app](#app) following the user's preferences, the scraper also creates a JSON manifest file containing information about the documentations currently available on the system (such as their name, version, update date, etc.).
More information about [scrapers](./docs/scraper-reference.md) and [filters](./docs/filter-reference.md) is available in the `docs` folder.
## Available Commands
The command-line interface uses [Thor](http://whatisthor.com). To see all commands and options, run `thor list` from the project's root.
```sh
# Server
rackup # Start the server (ctrl+c to stop)
rackup --help # List server options
# Docs
thor docs:list # List available documentations
thor docs:download # Download one or more documentations
thor docs:manifest # Create the manifest file used by the app
thor docs:generate # Generate/scrape a documentation
thor docs:page # Generate/scrape a documentation page
thor docs:package # Package a documentation for use with docs:download
thor docs:clean # Delete documentation packages
# Console
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.
# Run "help test" for usage instructions.
thor test:all # Run all tests
thor test:docs # Run "Docs" tests
thor test:app # Run "App" tests
# Assets
thor assets:compile # Compile assets (not required in development mode)
thor assets:clean # Clean old assets
```
If multiple versions of Ruby are installed on your system, commands must be run through `bundle exec`.
## Contributing
Contributions are welcome. Please read the [contributing guidelines](./.github/CONTRIBUTING.md).
## Documentation
* [Adding documentations to DevDocs](./docs/adding-docs.md)
* [Scraper Reference](./docs/scraper-reference.md)
* [Filter Reference](./docs/filter-reference.md)
* [Maintainers’ Guide](./docs/maintainers.md)
## DevDocs Quick Usage Cheatsheet
Below are some helpful shortcuts and usage tips that are not immediately obvious to new users:
- Press <kbd>/</kbd> or <kbd>Ctrl + K</kbd> to instantly focus the search bar.
- Press <kbd>?</kbd> to open DevDocs’ built-in help overlay.
- Press <kbd>↑</kbd> or <kbd>↓</kbd> to navigate search results without touching the mouse.
- Press <kbd>Enter</kbd> to open the highlighted search result.
- Press <kbd>Backspace</kbd> to go back to the previously viewed page.
- Press <kbd>Shift + S</kbd> to toggle the sidebar visibility.
- Press <kbd>A</kbd> to open the list of all installed documentation sets.
- Press <kbd>Esc</kbd> to close popups, overlays, and search.
- Use the **⚡ Offline Mode toggle** to download docs for offline use.
- You can pin specific documentation sets to the sidebar for quicker access.
These shortcuts make DevDocs faster to navigate and more efficient for daily use.
## Related Projects
Made something cool? Feel free to open a PR to add a new row to this table! You might want to discover new projects via https://github.com/topics/devdocs.
<!-- table is sorted by description -->
| Project | Description | Last commit | Stars |
| ------------------------------------------------------------------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| [yannickglt/alfred-devdocs](https://github.com/yannickglt/alfred-devdocs) | Alfred workflow |  |  |
| [Merith-TK/devdocs_webapp_kotlin](https://github.com/Merith-TK/devdocs_webapp_kotlin) | Android application |  |  |
| [gruehle/dev-docs-viewer](https://github.com/gruehle/dev-docs-viewer) | Brackets extension |  |  |
| [egoist/devdocs-desktop](https://github.com/egoist/devdocs-desktop) | Electron application |  |  |
| [skeeto/devdocs-lookup](https://github.com/skeeto/devdocs-lookup) | Emacs function |  |  |
| [astoff/devdocs.el](https://github.com/astoff/devdocs.el) | Emacs viewer |  |  |
| [naquad/devdocs-shell](https://github.com/naquad/devdocs-shell) | GTK shell with Vim integration |  |  |
| [hardpixel/devdocs-desktop](https://github.com/hardpixel/devdocs-desktop) | GTK application |  |  |
| [qwfy/doc-browser](https://github.com/qwfy/doc-browser) | Linux application |  |  |
| [dteoh/devdocs-macos](https://github.com/dteoh/devdocs-macos) | macOS application |  |  |
| [Sublime Text plugin](https://sublime.wbond.net/packages/DevDocs) | Sublime Text plugin |  |  |
| [mohamed3nan/DevDocs-Tab](https://github.com/mohamed3nan/DevDocs-Tab) | VS Code extension (view as tab) |  |  |
| [deibit/vscode-devdocs](https://marketplace.visualstudio.com/items?itemName=deibit.devdocs) | VS Code extension (open the browser) |  |  |
| [mdh34/quickDocs](https://github.com/mdh34/quickDocs) | Vala/Python based viewer |  |  |
| [girishji/devdocs.vim](https://github.com/girishji/devdocs.vim) | Vim plugin & TUI (browse inside Vim) |  |  |
| [romainl/vim-devdocs](https://github.com/romainl/vim-devdocs) | Vim plugin |  |  |
| [waiting-for-dev/vim-www](https://github.com/waiting-for-dev/vim-www) | Vim plugin |  |  |
| [emmanueltouzery/apidocs.nvim](https://github.com/emmanueltouzery/apidocs.nvim) | Neovim plugin |  |  |
| [toiletbril/dedoc](https://github.com/toiletbril/dedoc) | Terminal based viewer |  |  |
| [Raycast Devdocs](https://www.raycast.com/djpowers/devdocs) | Raycast extension | Unavailable | Unavailable |
| [chrisgrieser/alfred-docs-searches](https://github.com/chrisgrieser/alfred-docs-searches) | Alfred workflow |  |  |
## Copyright / License
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.
Please do not use the name DevDocs to endorse or promote products derived from this software without the maintainers' permission, except as may be necessary to comply with the notice/attribution requirements.
We also wish that any documentation file generated using this software be attributed to DevDocs. Let's be fair to all contributors by giving credit where credit's due. Thanks!
## Questions?
If you have any questions, please feel free to ask them on the `#contributors` chat room on [Discord](https://discord.gg/PRyKn3Vbay).
================================================
FILE: Rakefile
================================================
#!/usr/bin/env rake
require 'bundler/setup'
require 'thor'
Bundler.require :default
$LOAD_PATH.unshift 'lib'
task :default do
$LOAD_PATH.unshift 'test'
Dir['test/**/*_test.rb'].map(&File.method(:expand_path)).each(&method(:require))
end
namespace :assets do
desc 'Compile all assets'
task :precompile do
load 'tasks/docs.thor'
DocsCLI.new.prepare_deploy
load 'tasks/assets.thor'
AssetsCLI.new.compile
end
end
================================================
FILE: Thorfile
================================================
$LOAD_PATH.unshift 'lib'
================================================
FILE: assets/images/.gitignore
================================================
sprites/**/*
================================================
FILE: assets/javascripts/app/app.js
================================================
class App extends Events {
_$ = $;
_$$ = $$;
_page = page;
collections = {};
models = {};
templates = {};
views = {};
init() {
try {
this.initErrorTracking();
} catch (error) {}
if (!this.browserCheck()) {
return;
}
this.el = $("._app");
this.localStorage = new LocalStorageStore();
if (app.ServiceWorker.isEnabled()) {
this.serviceWorker = new app.ServiceWorker();
}
this.settings = new app.Settings();
this.db = new app.DB();
this.settings.initLayout();
this.docs = new app.collections.Docs();
this.disabledDocs = new app.collections.Docs();
this.entries = new app.collections.Entries();
this.router = new app.Router();
this.shortcuts = new app.Shortcuts();
this.document = new app.views.Document();
if (this.isMobile()) {
this.mobile = new app.views.Mobile();
}
if (document.body.hasAttribute("data-doc")) {
this.DOC = JSON.parse(document.body.getAttribute("data-doc"));
this.bootOne();
} else if (this.DOCS) {
this.bootAll();
} else {
this.onBootError();
}
}
browserCheck() {
if (this.isSupportedBrowser()) {
return true;
}
document.body.innerHTML = app.templates.unsupportedBrowser;
this.hideLoadingScreen();
return false;
}
initErrorTracking() {
// Show a warning message and don't track errors when the app is loaded
// from a domain other than our own, because things are likely to break.
// (e.g. cross-domain requests)
if (this.isInvalidLocation()) {
new app.views.Notif("InvalidLocation");
} else {
if (this.config.sentry_dsn) {
Raven.config(this.config.sentry_dsn, {
release: this.config.release,
whitelistUrls: [/devdocs/],
includePaths: [/devdocs/],
ignoreErrors: [/NPObject/, /NS_ERROR/, /^null$/, /EvalError/],
tags: {
mode: this.isSingleDoc() ? "single" : "full",
iframe: (window.top !== window).toString(),
electron: (!!window.process?.versions?.electron).toString(),
},
shouldSendCallback: () => {
try {
if (this.isInjectionError()) {
this.onInjectionError();
return false;
}
if (this.isAndroidWebview()) {
return false;
}
} catch (error) {}
return true;
},
dataCallback(data) {
try {
data.user ||= {};
Object.assign(data.user, app.settings.dump());
if (data.user.docs) {
data.user.docs = data.user.docs.split("/");
}
if (app.lastIDBTransaction) {
data.user.lastIDBTransaction = app.lastIDBTransaction;
}
data.tags.scriptCount = document.scripts.length;
} catch (error) {}
return data;
},
}).install();
}
this.previousErrorHandler = onerror;
window.onerror = this.onWindowError.bind(this);
CookiesStore.onBlocked = this.onCookieBlocked;
}
}
bootOne() {
this.doc = new app.models.Doc(this.DOC);
this.docs.reset([this.doc]);
this.doc.load(this.start.bind(this), this.onBootError.bind(this), {
readCache: true,
});
new app.views.Notice("singleDoc", this.doc);
delete this.DOC;
}
bootAll() {
const docs = this.settings.getDocs();
for (var doc of this.DOCS) {
(docs.includes(doc.slug) ? this.docs : this.disabledDocs).add(doc);
}
this.migrateDocs();
this.docs.load(this.start.bind(this), this.onBootError.bind(this), {
readCache: true,
writeCache: true,
});
delete this.DOCS;
}
start() {
let doc;
for (doc of this.docs.all()) {
this.entries.add(doc.toEntry());
}
for (doc of this.disabledDocs.all()) {
this.entries.add(doc.toEntry());
}
for (doc of this.docs.all()) {
this.initDoc(doc);
}
this.trigger("ready");
this.router.start();
this.hideLoadingScreen();
setTimeout(() => {
if (!this.doc) {
this.welcomeBack();
}
return this.removeEvent("ready bootError");
}, 50);
}
initDoc(doc) {
for (var type of doc.types.all()) {
doc.entries.add(type.toEntry());
}
this.entries.add(doc.entries.all());
}
migrateDocs() {
let needsSaving;
for (var slug of this.settings.getDocs()) {
if (!this.docs.findBy("slug", slug)) {
var doc;
needsSaving = true;
if (slug === "webpack~2") {
doc = this.disabledDocs.findBy("slug", "webpack");
}
if (slug === "angular~4_typescript") {
doc = this.disabledDocs.findBy("slug", "angular");
}
if (slug === "angular~2_typescript") {
doc = this.disabledDocs.findBy("slug", "angular~2");
}
if (!doc) {
doc = this.disabledDocs.findBy("slug_without_version", slug);
}
if (doc) {
this.disabledDocs.remove(doc);
this.docs.add(doc);
}
}
}
if (needsSaving) {
this.saveDocs();
}
}
enableDoc(doc, _onSuccess, onError) {
if (this.docs.contains(doc)) {
return;
}
const onSuccess = () => {
if (this.docs.contains(doc)) {
return;
}
this.disabledDocs.remove(doc);
this.docs.add(doc);
this.docs.sort();
this.initDoc(doc);
this.saveDocs();
if (app.settings.get("autoInstall")) {
doc.install(_onSuccess, onError);
} else {
_onSuccess();
}
};
doc.load(onSuccess, onError, { writeCache: true });
}
saveDocs() {
this.settings.setDocs(this.docs.all().map((doc) => doc.slug));
this.db.migrate();
return this.serviceWorker != null
? this.serviceWorker.updateInBackground()
: undefined;
}
welcomeBack() {
let visitCount = this.settings.get("count");
this.settings.set("count", ++visitCount);
if (visitCount === 5) {
new app.views.Notif("Share", { autoHide: null });
}
new app.views.News();
new app.views.Updates();
return (this.updateChecker = new app.UpdateChecker());
}
reboot() {
if (location.pathname !== "/" && location.pathname !== "/settings") {
window.location = `/#${location.pathname}`;
} else {
window.location = "/";
}
}
reload() {
this.docs.clearCache();
this.disabledDocs.clearCache();
if (this.serviceWorker) {
this.serviceWorker.reload();
} else {
this.reboot();
}
}
reset() {
this.localStorage.reset();
this.settings.reset();
if (this.db != null) {
this.db.reset();
}
if (this.serviceWorker != null) {
this.serviceWorker.update();
}
window.location = "/";
}
showTip(tip) {
if (this.isSingleDoc()) {
return;
}
const tips = this.settings.getTips();
if (!tips.includes(tip)) {
tips.push(tip);
this.settings.setTips(tips);
new app.views.Tip(tip);
}
}
hideLoadingScreen() {
if ($.overlayScrollbarsEnabled()) {
document.body.classList.add("_overlay-scrollbars");
}
document.documentElement.classList.remove("_booting");
}
indexHost() {
// Can't load the index files from the host/CDN when service worker is
// enabled because it doesn't support caching URLs that use CORS.
return this.config[
this.serviceWorker && this.settings.hasDocs()
? "index_path"
: "docs_origin"
];
}
onBootError(...args) {
this.trigger("bootError");
this.hideLoadingScreen();
}
onQuotaExceeded() {
if (this.quotaExceeded) {
return;
}
this.quotaExceeded = true;
new app.views.Notif("QuotaExceeded", { autoHide: null });
}
onCookieBlocked(key, value, actual) {
if (this.cookieBlocked) {
return;
}
this.cookieBlocked = true;
new app.views.Notif("CookieBlocked", { autoHide: null });
Raven.captureMessage(`CookieBlocked/${key}`, {
level: "warning",
extra: { value, actual },
});
}
onWindowError(...args) {
if (this.cookieBlocked) {
return;
}
if (this.isInjectionError(...args)) {
this.onInjectionError();
} else if (this.isAppError(...args)) {
if (typeof this.previousErrorHandler === "function") {
this.previousErrorHandler(...args);
}
this.hideLoadingScreen();
if (!this.errorNotif) {
this.errorNotif = new app.views.Notif("Error");
}
this.errorNotif.show();
}
}
onInjectionError() {
if (!this.injectionError) {
this.injectionError = true;
alert(`\
JavaScript code has been injected in the page which prevents DevDocs from running correctly.
Please check your browser extensions/addons. `);
Raven.captureMessage("injection error", { level: "info" });
}
}
isInjectionError() {
// Some browser extensions expect the entire web to use jQuery.
// I gave up trying to fight back.
return (
window.$ !== app._$ ||
window.$$ !== app._$$ ||
window.page !== app._page ||
typeof $.empty !== "function" ||
typeof page.show !== "function"
);
}
isAppError(error, file) {
// Ignore errors from external scripts.
return file && file.includes("devdocs") && file.endsWith(".js");
}
isSupportedBrowser() {
try {
const features = {
bind: !!Function.prototype.bind,
pushState: !!history.pushState,
matchMedia: !!window.matchMedia,
insertAdjacentHTML: !!document.body.insertAdjacentHTML,
defaultPrevented:
document.createEvent("CustomEvent").defaultPrevented === false,
cssVariables: !!CSS.supports?.("(--t: 0)"),
};
for (var key in features) {
var value = features[key];
if (!value) {
Raven.captureMessage(`unsupported/${key}`, { level: "info" });
return false;
}
}
return true;
} catch (error) {
Raven.captureMessage("unsupported/exception", {
level: "info",
extra: { error },
});
return false;
}
}
isSingleDoc() {
return document.body.hasAttribute("data-doc");
}
isMobile() {
return this._isMobile != null
? this._isMobile
: (this._isMobile = app.views.Mobile.detect());
}
isAndroidWebview() {
return this._isAndroidWebview != null
? this._isAndroidWebview
: (this._isAndroidWebview = app.views.Mobile.detectAndroidWebview());
}
isInvalidLocation() {
return (
this.config.env === "production" &&
!location.host.startsWith(app.config.production_host)
);
}
}
this.app = new App();
================================================
FILE: assets/javascripts/app/config.js.erb
================================================
app.config = {
db_filename: 'db.json',
default_docs: <%= App.default_docs.to_json %>,
docs_aliases: <%= App.docs_aliases.to_json %>,
docs_origin: '<%= App.docs_origin %>',
env: '<%= App.environment %>',
history_cache_size: 10,
index_filename: 'index.json',
index_path: '/<%= App.docs_prefix %>',
max_results: 50,
production_host: 'devdocs.io',
search_param: 'q',
sentry_dsn: '<%= App.sentry_dsn %>',
version: <%= Time.now.to_i %>,
release: <%= Time.now.utc.httpdate.to_json %>,
mathml_stylesheet: '/mathml.css',
favicon_spritesheet: '<%= image_path('sprites/docs.png') %>',
service_worker_path: '/service-worker.js',
service_worker_enabled: <%= App.environment == :production || ENV['ENABLE_SERVICE_WORKER'] == 'true' %>,
}
================================================
FILE: assets/javascripts/app/db.js
================================================
app.DB = class DB {
static NAME = "docs";
static VERSION = 15;
constructor() {
this.versionMultipler = $.isIE() ? 1e5 : 1e9;
this.useIndexedDB = this.useIndexedDB();
this.callbacks = [];
}
db(fn) {
if (!this.useIndexedDB) {
return fn();
}
if (fn) {
this.callbacks.push(fn);
}
if (this.open) {
return;
}
try {
this.open = true;
const req = indexedDB.open(
DB.NAME,
DB.VERSION * this.versionMultipler + this.userVersion(),
);
req.onsuccess = (event) => this.onOpenSuccess(event);
req.onerror = (event) => this.onOpenError(event);
req.onupgradeneeded = (event) => this.onUpgradeNeeded(event);
} catch (error) {
this.fail("exception", error);
}
}
onOpenSuccess(event) {
let error;
const db = event.target.result;
if (db.objectStoreNames.length === 0) {
try {
db.close();
} catch (error1) {}
this.open = false;
this.fail("empty");
} else if ((error = this.buggyIDB(db))) {
try {
db.close();
} catch (error2) {}
this.open = false;
this.fail("buggy", error);
} else {
this.runCallbacks(db);
this.open = false;
db.close();
}
}
onOpenError(event) {
event.preventDefault();
this.open = false;
const { error } = event.target;
switch (error.name) {
case "QuotaExceededError":
this.onQuotaExceededError();
break;
case "VersionError":
this.onVersionError();
break;
case "InvalidStateError":
this.fail("private_mode");
break;
default:
this.fail("cant_open", error);
}
}
fail(reason, error) {
this.cachedDocs = null;
this.useIndexedDB = false;
if (!this.reason) {
this.reason = reason;
}
if (!this.error) {
this.error = error;
}
if (error) {
if (typeof console.error === "function") {
console.error("IDB error", error);
}
}
this.runCallbacks();
if (error && reason === "cant_open") {
Raven.captureMessage(`${error.name}: ${error.message}`, {
level: "warning",
fingerprint: [error.name],
});
}
}
onQuotaExceededError() {
this.reset();
this.db();
app.onQuotaExceeded();
Raven.captureMessage("QuotaExceededError", { level: "warning" });
}
onVersionError() {
const req = indexedDB.open(DB.NAME);
req.onsuccess = (event) => {
return this.handleVersionMismatch(event.target.result.version);
};
req.onerror = function (event) {
event.preventDefault();
return this.fail("cant_open", error);
};
}
handleVersionMismatch(actualVersion) {
if (Math.floor(actualVersion / this.versionMultipler) !== DB.VERSION) {
this.fail("version");
} else {
this.setUserVersion(actualVersion - DB.VERSION * this.versionMultipler);
this.db();
}
}
buggyIDB(db) {
if (this.checkedBuggyIDB) {
return;
}
this.checkedBuggyIDB = true;
try {
this.idbTransaction(db, {
stores: $.makeArray(db.objectStoreNames).slice(0, 2),
mode: "readwrite",
}).abort(); // https://bugs.webkit.org/show_bug.cgi?id=136937
return;
} catch (error) {
return error;
}
}
runCallbacks(db) {
let fn;
while ((fn = this.callbacks.shift())) {
fn(db);
}
}
onUpgradeNeeded(event) {
const db = event.target.result;
if (!db) {
return;
}
const objectStoreNames = $.makeArray(db.objectStoreNames);
if (!$.arrayDelete(objectStoreNames, "docs")) {
try {
db.createObjectStore("docs");
} catch (error) {}
}
for (var doc of app.docs.all()) {
if (!$.arrayDelete(objectStoreNames, doc.slug)) {
try {
db.createObjectStore(doc.slug);
} catch (error1) {}
}
}
for (var name of objectStoreNames) {
try {
db.deleteObjectStore(name);
} catch (error2) {}
}
}
store(doc, data, onSuccess, onError, _retry) {
if (_retry == null) {
_retry = true;
}
this.db((db) => {
if (!db) {
onError();
return;
}
const txn = this.idbTransaction(db, {
stores: ["docs", doc.slug],
mode: "readwrite",
ignoreError: false,
});
txn.oncomplete = () => {
if (this.cachedDocs != null) {
this.cachedDocs[doc.slug] = doc.mtime;
}
onSuccess();
};
txn.onerror = (event) => {
event.preventDefault();
if (txn.error?.name === "NotFoundError" && _retry) {
this.migrate();
setTimeout(() => {
return this.store(doc, data, onSuccess, onError, false);
}, 0);
} else {
onError(event);
}
};
let store = txn.objectStore(doc.slug);
store.clear();
for (var path in data) {
var content = data[path];
store.add(content, path);
}
store = txn.objectStore("docs");
store.put(doc.mtime, doc.slug);
});
}
unstore(doc, onSuccess, onError, _retry) {
if (_retry == null) {
_retry = true;
}
this.db((db) => {
if (!db) {
onError();
return;
}
const txn = this.idbTransaction(db, {
stores: ["docs", doc.slug],
mode: "readwrite",
ignoreError: false,
});
txn.oncomplete = () => {
if (this.cachedDocs != null) {
delete this.cachedDocs[doc.slug];
}
onSuccess();
};
txn.onerror = function (event) {
event.preventDefault();
if (txn.error?.name === "NotFoundError" && _retry) {
this.migrate();
setTimeout(() => {
return this.unstore(doc, onSuccess, onError, false);
}, 0);
} else {
onError(event);
}
};
let store = txn.objectStore("docs");
store.delete(doc.slug);
store = txn.objectStore(doc.slug);
store.clear();
});
}
version(doc, fn) {
const version = this.cachedVersion(doc);
if (version != null) {
fn(version);
return;
}
this.db((db) => {
if (!db) {
fn(false);
return;
}
const txn = this.idbTransaction(db, {
stores: ["docs"],
mode: "readonly",
});
const store = txn.objectStore("docs");
const req = store.get(doc.slug);
req.onsuccess = function () {
fn(req.result);
};
req.onerror = function (event) {
event.preventDefault();
fn(false);
};
});
}
cachedVersion(doc) {
if (!this.cachedDocs) {
return;
}
return this.cachedDocs[doc.slug] || false;
}
versions(docs, fn) {
const versions = this.cachedVersions(docs);
if (versions) {
fn(versions);
return;
}
return this.db((db) => {
if (!db) {
fn(false);
return;
}
const txn = this.idbTransaction(db, {
stores: ["docs"],
mode: "readonly",
});
txn.oncomplete = function () {
fn(result);
};
const store = txn.objectStore("docs");
var result = {};
docs.forEach((doc) => {
const req = store.get(doc.slug);
req.onsuccess = function () {
result[doc.slug] = req.result;
};
req.onerror = function (event) {
event.preventDefault();
result[doc.slug] = false;
};
});
});
}
cachedVersions(docs) {
if (!this.cachedDocs) {
return;
}
const result = {};
for (var doc of docs) {
result[doc.slug] = this.cachedVersion(doc);
}
return result;
}
load(entry, onSuccess, onError) {
if (this.shouldLoadWithIDB(entry)) {
return this.loadWithIDB(entry, onSuccess, () =>
this.loadWithXHR(entry, onSuccess, onError)
);
} else {
return this.loadWithXHR(entry, onSuccess, onError);
}
}
loadWithXHR(entry, onSuccess, onError) {
return ajax({
url: entry.fileUrl(),
dataType: "html",
success: onSuccess,
error: onError,
});
}
loadWithIDB(entry, onSuccess, onError) {
return this.db((db) => {
if (!db) {
onError();
return;
}
if (!db.objectStoreNames.contains(entry.doc.slug)) {
onError();
this.loadDocsCache(db);
return;
}
const txn = this.idbTransaction(db, {
stores: [entry.doc.slug],
mode: "readonly",
});
const store = txn.objectStore(entry.doc.slug);
const req = store.get(entry.dbPath());
req.onsuccess = function () {
if (req.result) {
onSuccess(req.result);
} else {
onError();
}
};
req.onerror = function (event) {
event.preventDefault();
onError();
};
this.loadDocsCache(db);
});
}
loadDocsCache(db) {
if (this.cachedDocs) {
return;
}
this.cachedDocs = {};
const txn = this.idbTransaction(db, {
stores: ["docs"],
mode: "readonly",
});
txn.oncomplete = () => {
setTimeout(() => this.checkForCorruptedDocs(), 50);
};
const req = txn.objectStore("docs").openCursor();
req.onsuccess = (event) => {
const cursor = event.target.result;
if (!cursor) {
return;
}
this.cachedDocs[cursor.key] = cursor.value;
cursor.continue();
};
req.onerror = function (event) {
event.preventDefault();
};
}
checkForCorruptedDocs() {
this.db((db) => {
let slug;
this.corruptedDocs = [];
const docs = (() => {
const result = [];
for (var key in this.cachedDocs) {
var value = this.cachedDocs[key];
if (value) {
result.push(key);
}
}
return result;
})();
if (docs.length === 0) {
return;
}
for (slug of docs) {
if (!app.docs.findBy("slug", slug)) {
this.corruptedDocs.push(slug);
}
}
for (slug of this.corruptedDocs) {
$.arrayDelete(docs, slug);
}
if (docs.length === 0) {
setTimeout(() => this.deleteCorruptedDocs(), 0);
return;
}
const txn = this.idbTransaction(db, {
stores: docs,
mode: "readonly",
ignoreError: false,
});
txn.oncomplete = () => {
if (this.corruptedDocs.length > 0) {
setTimeout(() => this.deleteCorruptedDocs(), 0);
}
};
for (var doc of docs) {
txn.objectStore(doc).get("index").onsuccess = (event) => {
if (!event.target.result) {
this.corruptedDocs.push(event.target.source.name);
}
};
}
});
}
deleteCorruptedDocs() {
this.db((db) => {
let doc;
const txn = this.idbTransaction(db, {
stores: ["docs"],
mode: "readwrite",
ignoreError: false,
});
const store = txn.objectStore("docs");
while ((doc = this.corruptedDocs.pop())) {
this.cachedDocs[doc] = false;
store.delete(doc);
}
});
Raven.captureMessage("corruptedDocs", {
level: "info",
extra: { docs: this.corruptedDocs.join(",") },
});
}
shouldLoadWithIDB(entry) {
return (
this.useIndexedDB && (!this.cachedDocs || this.cachedDocs[entry.doc.slug])
);
}
idbTransaction(db, options) {
app.lastIDBTransaction = [options.stores, options.mode];
const txn = db.transaction(options.stores, options.mode);
if (options.ignoreError !== false) {
txn.onerror = function (event) {
event.preventDefault();
};
}
if (options.ignoreAbort !== false) {
txn.onabort = function (event) {
event.preventDefault();
};
}
return txn;
}
reset() {
try {
indexedDB?.deleteDatabase(DB.NAME);
} catch (error) {}
}
useIndexedDB() {
try {
if (!app.isSingleDoc() && window.indexedDB) {
return true;
} else {
this.reason = "not_supported";
return false;
}
} catch (error) {
return false;
}
}
migrate() {
app.settings.set("schema", this.userVersion() + 1);
}
setUserVersion(version) {
app.settings.set("schema", version);
}
userVersion() {
return app.settings.get("schema");
}
};
================================================
FILE: assets/javascripts/app/router.js
================================================
app.Router = class Router extends Events {
static routes = [
["*", "before"],
["/", "root"],
["/settings", "settings"],
["/offline", "offline"],
["/about", "about"],
["/news", "news"],
["/help", "help"],
["/:doc-:type/", "type"],
["/:doc/", "doc"],
["/:doc/:path(*)", "entry"],
["*", "notFound"],
];
constructor() {
super();
for (var [path, method] of this.constructor.routes) {
page(path, this[method].bind(this));
}
this.setInitialPath();
}
start() {
page.start();
}
show(path) {
page.show(path);
}
triggerRoute(name) {
this.trigger(name, this.context);
this.trigger("after", name, this.context);
}
before(context, next) {
const previousContext = this.context;
this.context = context;
this.trigger("before", context);
const res = next();
if (res) {
this.context = previousContext;
return res;
} else {
return;
}
}
doc(context, next) {
let doc;
if (
(doc =
app.docs.findBySlug(context.params.doc) ||
app.disabledDocs.findBySlug(context.params.doc))
) {
context.doc = doc;
context.entry = doc.toEntry();
this.triggerRoute("entry");
return;
} else {
return next();
}
}
type(context, next) {
const doc = app.docs.findBySlug(context.params.doc);
const type = doc?.types?.findBy("slug", context.params.type);
if (type) {
context.doc = doc;
context.type = type;
this.triggerRoute("type");
return;
} else {
return next();
}
}
entry(context, next) {
const doc = app.docs.findBySlug(context.params.doc);
if (!doc) {
return next();
}
let { path } = context.params;
const { hash } = context;
let entry = doc.findEntryByPathAndHash(path, hash);
if (entry) {
context.doc = doc;
context.entry = entry;
this.triggerRoute("entry");
return;
} else if (path.slice(-6) === "/index") {
path = path.substr(0, path.length - 6);
entry = doc.findEntryByPathAndHash(path, hash);
if (entry) {
return entry.fullPath();
}
} else {
path = `${path}/index`;
entry = doc.findEntryByPathAndHash(path, hash);
if (entry) {
return entry.fullPath();
}
}
return next();
}
root() {
if (app.isSingleDoc()) {
return "/";
}
this.triggerRoute("root");
}
settings(context) {
if (app.isSingleDoc()) {
return `/#/${context.path}`;
}
this.triggerRoute("settings");
}
offline(context) {
if (app.isSingleDoc()) {
return `/#/${context.path}`;
}
this.triggerRoute("offline");
}
about(context) {
if (app.isSingleDoc()) {
return `/#/${context.path}`;
}
context.page = "about";
this.triggerRoute("page");
}
news(context) {
if (app.isSingleDoc()) {
return `/#/${context.path}`;
}
context.page = "news";
this.triggerRoute("page");
}
help(context) {
if (app.isSingleDoc()) {
return `/#/${context.path}`;
}
context.page = "help";
this.triggerRoute("page");
}
notFound(context) {
this.triggerRoute("notFound");
}
isIndex() {
return (
this.context?.path === "/" ||
(app.isSingleDoc() && this.context?.entry?.isIndex())
);
}
isSettings() {
return this.context?.path === "/settings";
}
setInitialPath() {
// Remove superfluous forward slashes at the beginning of the path
let path = location.pathname.replace(/^\/{2,}/g, "/");
if (path !== location.pathname) {
page.replace(path + location.search + location.hash, null, true);
}
if (location.pathname === "/") {
if ((path = this.getInitialPathFromHash())) {
page.replace(path + location.search, null, true);
} else if ((path = this.getInitialPathFromCookie())) {
page.replace(path + location.search + location.hash, null, true);
}
}
}
getInitialPathFromHash() {
try {
return new RegExp("#/(.+)").exec(decodeURIComponent(location.hash))?.[1];
} catch (error) {}
}
getInitialPathFromCookie() {
const path = Cookies.get("initial_path");
if (path) {
Cookies.expire("initial_path");
return path;
}
}
replaceHash(hash) {
page.replace(
location.pathname + location.search + (hash || ""),
null,
true
);
}
};
================================================
FILE: assets/javascripts/app/searcher.js
================================================
//
// Match functions
//
let fuzzyRegexp,
i,
index,
lastIndex,
match,
matcher,
matchIndex,
matchLength,
queryLength,
score,
separators,
value,
valueLength;
const SEPARATOR = ".";
let query =
(queryLength =
value =
valueLength =
matcher = // current match function
fuzzyRegexp = // query fuzzy regexp
index = // position of the query in the string being matched
lastIndex = // last position of the query in the string being matched
match = // regexp match data
matchIndex =
matchLength =
score = // score for the current match
separators = // counter
i =
null); // cursor
function exactMatch() {
index = value.indexOf(query);
if (!(index >= 0)) {
return;
}
lastIndex = value.lastIndexOf(query);
if (index !== lastIndex) {
return Math.max(
scoreExactMatch(),
((index = lastIndex) && scoreExactMatch()) || 0,
);
} else {
return scoreExactMatch();
}
}
function scoreExactMatch() {
// Remove one point for each unmatched character.
score = 100 - (valueLength - queryLength);
if (index > 0) {
// If the character preceding the query is a dot, assign the same score
// as if the query was found at the beginning of the string, minus one.
if (value.charAt(index - 1) === SEPARATOR) {
score += index - 1;
// Don't match a single-character query unless it's found at the beginning
// of the string or is preceded by a dot.
} else if (queryLength === 1) {
return;
// (1) Remove one point for each unmatched character up to the nearest
// preceding dot or the beginning of the string.
// (2) Remove one point for each unmatched character following the query.
} else {
i = index - 2;
while (i >= 0 && value.charAt(i) !== SEPARATOR) {
i--;
}
score -=
index -
i + // (1)
(valueLength - queryLength - index); // (2)
}
// Remove one point for each dot preceding the query, except for the one
// immediately before the query.
separators = 0;
i = index - 2;
while (i >= 0) {
if (value.charAt(i) === SEPARATOR) {
separators++;
}
i--;
}
score -= separators;
}
// Remove five points for each dot following the query.
separators = 0;
i = valueLength - queryLength - index - 1;
while (i >= 0) {
if (value.charAt(index + queryLength + i) === SEPARATOR) {
separators++;
}
i--;
}
score -= separators * 5;
return Math.max(1, score);
}
function fuzzyMatch() {
if (valueLength <= queryLength || value.includes(query)) {
return;
}
if (!(match = fuzzyRegexp.exec(value))) {
return;
}
matchIndex = match.index;
matchLength = match[0].length;
score = scoreFuzzyMatch();
if (
(match = fuzzyRegexp.exec(
value.slice((i = value.lastIndexOf(SEPARATOR) + 1)),
))
) {
matchIndex = i + match.index;
matchLength = match[0].length;
return Math.max(score, scoreFuzzyMatch());
} else {
return score;
}
}
function scoreFuzzyMatch() {
// When the match is at the beginning of the string or preceded by a dot.
if (matchIndex === 0 || value.charAt(matchIndex - 1) === SEPARATOR) {
return Math.max(66, 100 - matchLength);
// When the match is at the end of the string.
} else if (matchIndex + matchLength === valueLength) {
return Math.max(33, 67 - matchLength);
// When the match is in the middle of the string.
} else {
return Math.max(1, 34 - matchLength);
}
}
//
// Searchers
//
app.Searcher = class Searcher extends Events {
static CHUNK_SIZE = 20000;
static DEFAULTS = {
max_results: app.config.max_results,
fuzzy_min_length: 3,
};
static SEPARATORS_REGEXP =
/#|::|:-|->|\$(?=\w)|\-(?=\w)|\:(?=\w)|\ [\/\-&]\ |:\ |\ /g;
static EOS_SEPARATORS_REGEXP = /(\w)[\-:]$/;
static INFO_PARANTHESES_REGEXP = /\ \(\w+?\)$/;
static EMPTY_PARANTHESES_REGEXP = /\(\)/;
static EVENT_REGEXP = /\ event$/;
static DOT_REGEXP = /\.+/g;
static WHITESPACE_REGEXP = /\s/g;
static EMPTY_STRING = "";
static ELLIPSIS = "...";
static STRING = "string";
static normalizeString(string) {
return string
.toLowerCase()
.replace(Searcher.ELLIPSIS, Searcher.EMPTY_STRING)
.replace(Searcher.EVENT_REGEXP, Searcher.EMPTY_STRING)
.replace(Searcher.INFO_PARANTHESES_REGEXP, Searcher.EMPTY_STRING)
.replace(Searcher.SEPARATORS_REGEXP, SEPARATOR)
.replace(Searcher.DOT_REGEXP, SEPARATOR)
.replace(Searcher.EMPTY_PARANTHESES_REGEXP, Searcher.EMPTY_STRING)
.replace(Searcher.WHITESPACE_REGEXP, Searcher.EMPTY_STRING);
}
static normalizeQuery(string) {
string = this.normalizeString(string);
return string.replace(Searcher.EOS_SEPARATORS_REGEXP, "$1.");
}
constructor(options) {
super();
this.options = { ...Searcher.DEFAULTS, ...(options || {}) };
}
find(data, attr, q) {
this.kill();
this.data = data;
this.attr = attr;
this.query = q;
this.setup();
if (this.isValid()) {
this.match();
} else {
this.end();
}
}
setup() {
query = this.query = this.constructor.normalizeQuery(this.query);
queryLength = query.length;
this.dataLength = this.data.length;
this.matchers = [exactMatch];
this.totalResults = 0;
this.setupFuzzy();
}
setupFuzzy() {
if (queryLength >= this.options.fuzzy_min_length) {
fuzzyRegexp = this.queryToFuzzyRegexp(query);
this.matchers.push(fuzzyMatch);
} else {
fuzzyRegexp = null;
}
}
isValid() {
return queryLength > 0 && query !== SEPARATOR;
}
end() {
if (!this.totalResults) {
this.triggerResults([]);
}
this.trigger("end");
this.free();
}
kill() {
if (this.timeout) {
clearTimeout(this.timeout);
this.free();
}
}
free() {
this.data = null;
this.attr = null;
this.dataLength = null;
this.matchers = null;
this.matcher = null;
this.query = null;
this.totalResults = null;
this.scoreMap = null;
this.cursor = null;
this.timeout = null;
}
match() {
if (!this.foundEnough() && (this.matcher = this.matchers.shift())) {
this.setupMatcher();
this.matchChunks();
} else {
this.end();
}
}
setupMatcher() {
this.cursor = 0;
this.scoreMap = new Array(101);
}
matchChunks() {
this.matchChunk();
if (this.cursor === this.dataLength || this.scoredEnough()) {
this.delay(() => this.match());
this.sendResults();
} else {
this.delay(() => this.matchChunks());
}
}
matchChunk() {
({ matcher } = this);
for (let j = 0, end = this.chunkSize(); j < end; j++) {
value = this.data[this.cursor][this.attr];
if (value.split) {
// string
valueLength = value.length;
if ((score = matcher())) {
this.addResult(this.data[this.cursor], score);
}
} else {
// array
score = 0;
for (value of Array.from(this.data[this.cursor][this.attr])) {
valueLength = value.length;
score = Math.max(score, matcher() || 0);
}
if (score > 0) {
this.addResult(this.data[this.cursor], score);
}
}
this.cursor++;
}
}
chunkSize() {
if (this.cursor + Searcher.CHUNK_SIZE > this.dataLength) {
return this.dataLength % Searcher.CHUNK_SIZE;
} else {
return Searcher.CHUNK_SIZE;
}
}
scoredEnough() {
return this.scoreMap[100]?.length >= this.options.max_results;
}
foundEnough() {
return this.totalResults >= this.options.max_results;
}
addResult(object, score) {
let name;
(
this.scoreMap[(name = Math.round(score))] || (this.scoreMap[name] = [])
).push(object);
this.totalResults++;
}
getResults() {
const results = [];
for (let j = this.scoreMap.length - 1; j >= 0; j--) {
var objects = this.scoreMap[j];
if (objects) {
results.push(...objects);
}
}
return results.slice(0, this.options.max_results);
}
sendResults() {
const results = this.getResults();
if (results.length) {
this.triggerResults(results);
}
}
triggerResults(results) {
this.trigger("results", results);
}
delay(fn) {
return (this.timeout = setTimeout(fn, 1));
}
queryToFuzzyRegexp(string) {
const chars = string.split("");
for (i = 0; i < chars.length; i++) {
var char = chars[i];
chars[i] = $.escapeRegexp(char);
}
return new RegExp(chars.join(".*?")); // abc -> /a.*?b.*?c.*?/
}
};
app.SynchronousSearcher = class SynchronousSearcher extends app.Searcher {
match() {
if (this.matcher) {
if (!this.allResults) {
this.allResults = [];
}
this.allResults.push(...this.getResults());
}
return super.match(...arguments);
}
free() {
this.allResults = null;
return super.free(...arguments);
}
end() {
this.sendResults(true);
return super.end(...arguments);
}
sendResults(end) {
if (end && this.allResults?.length) {
return this.triggerResults(this.allResults);
}
}
delay(fn) {
return fn();
}
};
================================================
FILE: assets/javascripts/app/serviceworker.js
================================================
app.ServiceWorker = class ServiceWorker extends Events {
static isEnabled() {
return !!navigator.serviceWorker && app.config.service_worker_enabled;
}
constructor() {
super();
this.onStateChange = this.onStateChange.bind(this);
this.registration = null;
this.notifyUpdate = true;
navigator.serviceWorker
.register(app.config.service_worker_path, { scope: "/" })
.then(
(registration) => this.updateRegistration(registration),
(error) => console.error("Could not register service worker:", error),
);
}
update() {
if (!this.registration) {
return;
}
this.notifyUpdate = true;
return this.registration.update().catch(() => {});
}
updateInBackground() {
if (!this.registration) {
return;
}
this.notifyUpdate = false;
return this.registration.update().catch(() => {});
}
reload() {
return this.updateInBackground().then(() => app.reboot());
}
updateRegistration(registration) {
this.registration = registration;
$.on(this.registration, "updatefound", () => this.onUpdateFound());
}
onUpdateFound() {
if (this.installingRegistration) {
$.off(this.installingRegistration, "statechange", this.onStateChange);
}
this.installingRegistration = this.registration.installing;
$.on(this.installingRegistration, "statechange", this.onStateChange);
}
onStateChange() {
if (
this.installingRegistration &&
this.installingRegistration.state === "installed" &&
navigator.serviceWorker.controller
) {
this.installingRegistration = null;
this.onUpdateReady();
}
}
onUpdateReady() {
if (this.notifyUpdate) {
this.trigger("updateready");
}
}
};
================================================
FILE: assets/javascripts/app/settings.js
================================================
app.Settings = class Settings {
static PREFERENCE_KEYS = [
"hideDisabled",
"hideIntro",
"manualUpdate",
"fastScroll",
"arrowScroll",
"analyticsConsent",
"docs",
"dark", // legacy
"theme",
"layout",
"size",
"tips",
"noAutofocus",
"autoInstall",
"spaceScroll",
"spaceTimeout",
"noDocSpecificIcon",
];
static INTERNAL_KEYS = ["count", "schema", "version", "news"];
static LAYOUTS = [
"_max-width",
"_sidebar-hidden",
"_native-scrollbars",
"_text-justify-hyphenate",
];
static defaults = {
count: 0,
hideDisabled: false,
hideIntro: false,
news: 0,
manualUpdate: false,
schema: 1,
analyticsConsent: false,
theme: "auto",
spaceScroll: 1,
spaceTimeout: 0.5,
noDocSpecificIcon: false,
};
constructor() {
this.store = new CookiesStore();
this.cache = {};
this.autoSupported =
window.matchMedia("(prefers-color-scheme)").media !== "not all";
if (this.autoSupported) {
this.darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)");
this.darkModeQuery.addListener(() => this.setTheme(this.get("theme")));
}
}
get(key) {
let left;
if (this.cache.hasOwnProperty(key)) {
return this.cache[key];
}
this.cache[key] =
(left = this.store.get(key)) != null
? left
: this.constructor.defaults[key];
if (key === "theme" && this.cache[key] === "auto" && !this.darkModeQuery) {
return (this.cache[key] = "default");
} else {
return this.cache[key];
}
}
set(key, value) {
this.store.set(key, value);
delete this.cache[key];
if (key === "theme") {
this.setTheme(value);
}
}
del(key) {
this.store.del(key);
delete this.cache[key];
}
hasDocs() {
try {
return !!this.store.get("docs");
} catch (error) {}
}
getDocs() {
return this.store.get("docs")?.split("/") || app.config.default_docs;
}
setDocs(docs) {
this.set("docs", docs.join("/"));
}
getTips() {
return this.store.get("tips")?.split("/") || [];
}
setTips(tips) {
this.set("tips", tips.join("/"));
}
setLayout(name, enable) {
this.toggleLayout(name, enable);
const layout = (this.store.get("layout") || "").split(" ");
$.arrayDelete(layout, "");
if (enable) {
if (!layout.includes(name)) {
layout.push(name);
}
} else {
$.arrayDelete(layout, name);
}
if (layout.length > 0) {
this.set("layout", layout.join(" "));
} else {
this.del("layout");
}
}
hasLayout(name) {
const layout = (this.store.get("layout") || "").split(" ");
return layout.includes(name);
}
setSize(value) {
this.set("size", value);
}
dump() {
return this.store.dump();
}
export() {
const data = this.dump();
for (var key of Settings.INTERNAL_KEYS) {
delete data[key];
}
return data;
}
import(data) {
let key, value;
const object = this.export();
for (key in object) {
value = object[key];
if (!data.hasOwnProperty(key)) {
this.del(key);
}
}
for (key in data) {
value = data[key];
if (Settings.PREFERENCE_KEYS.includes(key)) {
this.set(key, value);
}
}
}
reset() {
this.store.reset();
this.cache = {};
}
initLayout() {
if (this.get("dark") === 1) {
this.set("theme", "dark");
this.del("dark");
}
this.setTheme(this.get("theme"));
for (var layout of app.Settings.LAYOUTS) {
this.toggleLayout(layout, this.hasLayout(layout));
}
this.initSidebarWidth();
}
setTheme(theme) {
if (theme === "auto") {
theme = this.darkModeQuery.matches ? "dark" : "default";
}
const { classList } = document.documentElement;
classList.remove("_theme-default", "_theme-dark");
classList.add("_theme-" + theme);
this.updateColorMeta();
}
updateColorMeta() {
const color = getComputedStyle(document.documentElement)
.getPropertyValue("--headerBackground")
.trim();
$("meta[name=theme-color]").setAttribute("content", color);
}
toggleLayout(layout, enable) {
const { classList } = document.body;
// sidebar is always shown for settings; its state is updated in app.views.Settings
if (layout !== "_sidebar-hidden" || !app.router?.isSettings) {
classList.toggle(layout, enable);
}
classList.toggle("_overlay-scrollbars", $.overlayScrollbarsEnabled());
}
initSidebarWidth() {
const size = this.get("size");
if (size) {
document.documentElement.style.setProperty("--sidebarWidth", size + "px");
}
}
};
================================================
FILE: assets/javascripts/app/shortcuts.js
================================================
app.Shortcuts = class Shortcuts extends Events {
constructor() {
super();
this.onKeydown = this.onKeydown.bind(this);
this.onKeypress = this.onKeypress.bind(this);
this.isMac = $.isMac();
this.start();
}
start() {
$.on(document, "keydown", this.onKeydown);
$.on(document, "keypress", this.onKeypress);
}
stop() {
$.off(document, "keydown", this.onKeydown);
$.off(document, "keypress", this.onKeypress);
}
swapArrowKeysBehavior() {
return app.settings.get("arrowScroll");
}
spaceScroll() {
return app.settings.get("spaceScroll");
}
showTip() {
app.showTip("KeyNav");
return (this.showTip = null);
}
spaceTimeout() {
return app.settings.get("spaceTimeout");
}
onKeydown(event) {
if (this.buggyEvent(event)) {
return;
}
const result = (() => {
if (event.ctrlKey || event.metaKey) {
if (!event.altKey && !event.shiftKey) {
return this.handleKeydownSuperEvent(event);
}
} else if (event.shiftKey) {
if (!event.altKey) {
return this.handleKeydownShiftEvent(event);
}
} else if (event.altKey) {
return this.handleKeydownAltEvent(event);
} else {
return this.handleKeydownEvent(event);
}
})();
if (result === false) {
event.preventDefault();
}
}
onKeypress(event) {
if (
this.buggyEvent(event) ||
(event.charCode === 63 && document.activeElement.tagName === "INPUT")
) {
return;
}
if (!event.ctrlKey && !event.metaKey) {
const result = this.handleKeypressEvent(event);
if (result === false) {
event.preventDefault();
}
}
}
handleKeydownEvent(event, _force) {
if (
!_force &&
[37, 38, 39, 40].includes(event.which) &&
this.swapArrowKeysBehavior()
) {
return this.handleKeydownAltEvent(event, true);
}
if (
!event.target.form &&
((48 <= event.which && event.which <= 57) ||
(65 <= event.which && event.which <= 90))
) {
this.trigger("typing");
return;
}
switch (event.which) {
case 8:
if (!event.target.form) {
return this.trigger("typing");
}
break;
case 13:
return this.trigger("enter");
case 27:
this.trigger("escape");
return false;
case 32:
if (
event.target.type === "search" &&
this.spaceScroll() &&
(!this.lastKeypress ||
this.lastKeypress < Date.now() - this.spaceTimeout() * 1000)
) {
this.trigger("pageDown");
return false;
}
break;
case 33:
return this.trigger("pageUp");
case 34:
return this.trigger("pageDown");
case 35:
if (!event.target.form) {
return this.trigger("pageBottom");
}
break;
case 36:
if (!event.target.form) {
return this.trigger("pageTop");
}
break;
case 37:
if (!event.target.value) {
return this.trigger("left");
}
break;
case 38:
this.trigger("up");
if (typeof this.showTip === "function") {
this.showTip();
}
return false;
case 39:
if (!event.target.value) {
return this.trigger("right");
}
break;
case 40:
this.trigger("down");
if (typeof this.showTip === "function") {
this.showTip();
}
return false;
case 191:
if (!event.target.form) {
this.trigger("typing");
return false;
}
break;
}
}
handleKeydownSuperEvent(event) {
switch (event.which) {
case 13:
return this.trigger("superEnter");
case 37:
if (this.isMac) {
this.trigger("superLeft");
return false;
}
break;
case 38:
this.trigger("pageTop");
return false;
case 39:
if (this.isMac) {
this.trigger("superRight");
return false;
}
break;
case 40:
this.trigger("pageBottom");
return false;
case 188:
this.trigger("preferences");
return false;
}
}
handleKeydownShiftEvent(event, _force) {
if (
!_force &&
[37, 38, 39, 40].includes(event.which) &&
this.swapArrowKeysBehavior()
) {
return this.handleKeydownEvent(event, true);
}
if (!event.target.form && 65 <= event.which && event.which <= 90) {
this.trigger("typing");
return;
}
switch (event.which) {
case 32:
this.trigger("pageUp");
return false;
case 38:
if (!getSelection()?.toString()) {
this.trigger("altUp");
return false;
}
break;
case 40:
if (!getSelection()?.toString()) {
this.trigger("altDown");
return false;
}
break;
}
}
handleKeydownAltEvent(event, _force) {
if (
!_force &&
[37, 38, 39, 40].includes(event.which) &&
this.swapArrowKeysBehavior()
) {
return this.handleKeydownEvent(event, true);
}
switch (event.which) {
case 9:
return this.trigger("altRight", event);
case 37:
if (!this.isMac) {
this.trigger("superLeft");
return false;
}
break;
case 38:
this.trigger("altUp");
return false;
case 39:
if (!this.isMac) {
this.trigger("superRight");
return false;
}
break;
case 40:
this.trigger("altDown");
return false;
case 67:
this.trigger("altC");
return false;
case 68:
this.trigger("altD");
return false;
case 70:
return this.trigger("altF", event);
case 71:
this.trigger("altG");
return false;
case 79:
this.trigger("altO");
return false;
case 82:
this.trigger("altR");
return false;
case 83:
this.trigger("altS");
return false;
}
}
handleKeypressEvent(event) {
if (event.which === 63 && !event.target.value) {
this.trigger("help");
return false;
} else {
return (this.lastKeypress = Date.now());
}
}
buggyEvent(event) {
try {
event.target;
event.ctrlKey;
event.which;
return false;
} catch (error) {
return true;
}
}
};
================================================
FILE: assets/javascripts/app/update_checker.js
================================================
app.UpdateChecker = class UpdateChecker {
constructor() {
this.lastCheck = Date.now();
$.on(window, "focus", () => this.onFocus());
if (app.serviceWorker) {
app.serviceWorker.on("updateready", () => this.onUpdateReady());
}
setTimeout(() => this.checkDocs(), 0);
}
check() {
if (app.serviceWorker) {
app.serviceWorker.update();
} else {
ajax({
url: $('script[src*="application"]').getAttribute("src"),
dataType: "application/javascript",
error: (_, xhr) => {
if (xhr.status === 404) {
return this.onUpdateReady();
}
},
});
}
}
onUpdateReady() {
new app.views.Notif("UpdateReady", { autoHide: null });
}
checkDocs() {
if (!app.settings.get("manualUpdate")) {
app.docs.updateInBackground();
} else {
app.docs.checkForUpdates((i) => {
if (i > 0) {
return this.onDocsUpdateReady();
}
});
}
}
onDocsUpdateReady() {
new app.views.Notif("UpdateDocs", { autoHide: null });
}
onFocus() {
if (Date.now() - this.lastCheck > 21600e3) {
this.lastCheck = Date.now();
this.check();
}
}
};
================================================
FILE: assets/javascripts/application.js
================================================
//= require_tree ./vendor
//= require lib/license
//= require_tree ./lib
//= require app/app
//= require app/config
//= require_tree ./app
//= require collections/collection
//= require_tree ./collections
//= require models/model
//= require_tree ./models
//= require views/view
//= require_tree ./views
//= require_tree ./templates
//= link_tree ../images/sprites
//= require tracking
var init = function () {
document.removeEventListener("DOMContentLoaded", init, false);
if (document.body) {
return app.init();
} else {
return setTimeout(init, 42);
}
};
document.addEventListener("DOMContentLoaded", init, false);
================================================
FILE: assets/javascripts/collections/collection.js
================================================
app.Collection = class Collection {
constructor(objects) {
if (objects == null) {
objects = [];
}
this.reset(objects);
}
model() {
return app.models[this.constructor.model];
}
reset(objects) {
if (objects == null) {
objects = [];
}
this.models = [];
for (var object of objects) {
this.add(object);
}
}
add(object) {
if (object instanceof app.Model) {
this.models.push(object);
} else if (object instanceof Array) {
for (var obj of object) {
this.add(obj);
}
} else if (object instanceof app.Collection) {
this.models.push(...(object.all() || []));
} else {
this.models.push(new (this.model())(object));
}
}
remove(model) {
this.models.splice(this.models.indexOf(model), 1);
}
size() {
return this.models.length;
}
isEmpty() {
return this.models.length === 0;
}
each(fn) {
for (var model of this.models) {
fn(model);
}
}
all() {
return this.models;
}
contains(model) {
return this.models.includes(model);
}
findBy(attr, value) {
return this.models.find((model) => model[attr] === value);
}
findAllBy(attr, value) {
return this.models.filter((model) => model[attr] === value);
}
countAllBy(attr, value) {
let i = 0;
for (var model of this.models) {
if (model[attr] === value) {
i += 1;
}
}
return i;
}
};
================================================
FILE: assets/javascripts/collections/docs.js
================================================
app.collections.Docs = class Docs extends app.Collection {
static model = "Doc";
static NORMALIZE_VERSION_RGX = /\.(\d)$/;
static NORMALIZE_VERSION_SUB = ".0$1";
// Load models concurrently.
// It's not pretty but I didn't want to import a promise library only for this.
static CONCURRENCY = 3;
findBySlug(slug) {
return (
this.findBy("slug", slug) || this.findBy("slug_without_version", slug)
);
}
sort() {
return this.models.sort((a, b) => {
if (a.name === b.name) {
if (
!a.version ||
a.version.replace(
Docs.NORMALIZE_VERSION_RGX,
Docs.NORMALIZE_VERSION_SUB,
) >
b.version.replace(
Docs.NORMALIZE_VERSION_RGX,
Docs.NORMALIZE_VERSION_SUB,
)
) {
return -1;
} else {
return 1;
}
} else if (a.name.toLowerCase() > b.name.toLowerCase()) {
return 1;
} else {
return -1;
}
});
}
load(onComplete, onError, options) {
let i = 0;
var next = () => {
if (i < this.models.length) {
this.models[i].load(next, fail, options);
} else if (i === this.models.length + Docs.CONCURRENCY - 1) {
onComplete();
}
i++;
};
var fail = function (...args) {
if (onError) {
onError(args);
onError = null;
}
next();
};
for (let j = 0, end = Docs.CONCURRENCY; j < end; j++) {
next();
}
}
clearCache() {
for (var doc of this.models) {
doc.clearCache();
}
}
uninstall(callback) {
let i = 0;
var next = () => {
if (i < this.models.length) {
this.models[i++].uninstall(next, next);
} else {
callback();
}
};
next();
}
getInstallStatuses(callback) {
app.db.versions(this.models, (statuses) => {
if (statuses) {
for (var key in statuses) {
var value = statuses[key];
statuses[key] = { installed: !!value, mtime: value };
}
}
callback(statuses);
});
}
checkForUpdates(callback) {
this.getInstallStatuses((statuses) => {
let i = 0;
if (statuses) {
for (var slug in statuses) {
var status = statuses[slug];
if (this.findBy("slug", slug).isOutdated(status)) {
i += 1;
}
}
}
callback(i);
});
}
updateInBackground() {
this.getInstallStatuses((statuses) => {
if (!statuses) {
return;
}
for (var slug in statuses) {
var status = statuses[slug];
var doc = this.findBy("slug", slug);
if (doc.isOutdated(status)) {
doc.install($.noop, $.noop);
}
}
});
}
};
================================================
FILE: assets/javascripts/collections/entries.js
================================================
app.collections.Entries = class Entries extends app.Collection {
static model = "Entry";
};
================================================
FILE: assets/javascripts/collections/types.js
================================================
app.collections.Types = class Types extends app.Collection {
static model = "Type";
static GUIDES_RGX =
/(^|\()(guides?|tutorials?|reference|book|getting\ started|manual|examples)($|[\):])/i;
static APPENDIX_RGX = /appendix/i;
groups() {
const result = [];
for (var type of this.models) {
const name = this._groupFor(type);
result[name] ||= [];
result[name].push(type);
}
return result.filter((e) => e.length > 0);
}
_groupFor(type) {
if (Types.GUIDES_RGX.test(type.name)) {
return 0;
} else if (Types.APPENDIX_RGX.test(type.name)) {
return 2;
} else {
return 1;
}
}
};
================================================
FILE: assets/javascripts/debug.js
================================================
//
// App
//
const _init = app.init;
app.init = function () {
console.time("Init");
_init.call(app);
console.timeEnd("Init");
return console.time("Load");
};
const _start = app.start;
app.start = function () {
console.timeEnd("Load");
console.time("Start");
_start.call(app, ...arguments);
return console.timeEnd("Start");
};
//
// Searcher
//
app.Searcher = class TimingSearcher extends app.Searcher {
setup() {
console.groupCollapsed(`Search: ${this.query}`);
console.time("Total");
return super.setup();
}
match() {
if (this.matcher) {
console.timeEnd(this.matcher.name);
}
return super.match();
}
setupMatcher() {
console.time(this.matcher.name);
return super.setupMatcher();
}
end() {
console.log(`Results: ${this.totalResults}`);
console.timeEnd("Total");
console.groupEnd();
return super.end();
}
kill() {
if (this.timeout) {
if (this.matcher) {
console.timeEnd(this.matcher.name);
}
console.groupEnd();
console.timeEnd("Total");
console.warn("Killed");
}
return super.kill();
}
};
//
// View tree
//
this.viewTree = function (view, level, visited) {
if (view == null) {
view = app.document;
}
if (level == null) {
level = 0;
}
if (visited == null) {
visited = [];
}
if (visited.includes(view)) {
return;
}
visited.push(view);
console.log(
`%c ${Array(level + 1).join(" ")}${
view.constructor.name
}: ${!!view.activated}`,
"color:" + ((view.activated && "green") || "red"),
);
for (var key of Object.keys(view || {})) {
var value = view[key];
if (key !== "view" && value) {
if (typeof value === "object" && value.setupElement) {
this.viewTree(value, level + 1, visited);
} else if (value.constructor.toString().match(/Object\(\)/)) {
for (var k of Object.keys(value || {})) {
var v = value[k];
if (v && typeof v === "object" && v.setupElement) {
this.viewTree(v, level + 1, visited);
}
}
}
}
}
};
================================================
FILE: assets/javascripts/docs.js.erb
================================================
//= depend_on docs.json
app.DOCS = <%= File.read App.docs_manifest_path %>;
================================================
FILE: assets/javascripts/lib/ajax.js
================================================
const MIME_TYPES = {
json: "application/json",
html: "text/html",
};
function ajax(options) {
applyDefaults(options);
serializeData(options);
const xhr = new XMLHttpRequest();
xhr.open(options.type, options.url, options.async);
applyCallbacks(xhr, options);
applyHeaders(xhr, options);
xhr.send(options.data);
if (options.async) {
return { abort: abort.bind(undefined, xhr) };
} else {
return parseResponse(xhr, options);
}
function applyDefaults(options) {
for (var key in ajax.defaults) {
if (options[key] == null) {
options[key] = ajax.defaults[key];
}
}
}
function serializeData(options) {
if (!options.data) {
return;
}
if (options.type === "GET") {
options.url += "?" + serializeParams(options.data);
options.data = null;
} else {
options.data = serializeParams(options.data);
}
}
function serializeParams(params) {
return Object.entries(params)
.map(
([key, value]) =>
`${encodeURIComponent(key)}=${encodeURIComponent(value)}`,
)
.join("&");
}
function applyCallbacks(xhr, options) {
if (!options.async) {
return;
}
xhr.timer = setTimeout(
onTimeout.bind(undefined, xhr, options),
options.timeout * 1000,
);
if (options.progress) {
xhr.onprogress = options.progress;
}
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
clearTimeout(xhr.timer);
onComplete(xhr, options);
}
};
}
function applyHeaders(xhr, options) {
if (!options.headers) {
options.headers = {};
}
if (options.contentType) {
options.headers["Content-Type"] = options.contentType;
}
if (
!options.headers["Content-Type"] &&
options.data &&
options.type !== "GET"
) {
options.headers["Content-Type"] = "application/x-www-form-urlencoded";
}
if (options.dataType) {
options.headers["Accept"] =
MIME_TYPES[options.dataType] || options.dataType;
}
for (var key in options.headers) {
var value = options.headers[key];
xhr.setRequestHeader(key, value);
}
}
function onComplete(xhr, options) {
if (200 <= xhr.status && xhr.status < 300) {
const response = parseResponse(xhr, options);
if (response != null) {
onSuccess(response, xhr, options);
} else {
onError("invalid", xhr, options);
}
} else {
onError("error", xhr, options);
}
}
function onSuccess(response, xhr, options) {
if (options.success != null) {
options.success.call(options.context, response, xhr, options);
}
}
function onError(type, xhr, options) {
if (options.error != null) {
options.error.call(options.context, type, xhr, options);
}
}
function onTimeout(xhr, options) {
xhr.abort();
onError("timeout", xhr, options);
}
function abort(xhr) {
clearTimeout(xhr.timer);
xhr.onreadystatechange = null;
xhr.abort();
}
function parseResponse(xhr, options) {
if (options.dataType === "json") {
return parseJSON(xhr.responseText);
} else {
return xhr.responseText;
}
}
function parseJSON(json) {
try {
return JSON.parse(json);
} catch (error) {}
}
}
ajax.defaults = {
async: true,
dataType: "json",
timeout: 30,
type: "GET",
// contentType
// context
// data
// error
// headers
// progress
// success
// url
};
================================================
FILE: assets/javascripts/lib/cookies_store.js
================================================
// Intentionally called CookiesStore instead of CookieStore
// Calling it CookieStore causes issues when the Experimental Web Platform features flag is enabled in Chrome
// Related issue: https://github.com/freeCodeCamp/devdocs/issues/932
class CookiesStore {
static INT = /^\d+$/;
static onBlocked() {}
get(key) {
let value = Cookies.get(key);
if (value != null && CookiesStore.INT.test(value)) {
value = parseInt(value, 10);
}
return value;
}
set(key, value) {
if (value === false) {
this.del(key);
return;
}
if (value === true) {
value = 1;
}
if (
value &&
(typeof CookiesStore.INT.test === "function"
? CookiesStore.INT.test(value)
: undefined)
) {
value = parseInt(value, 10);
}
Cookies.set(key, "" + value, { path: "/", expires: 1e8 });
if (this.get(key) !== value) {
CookiesStore.onBlocked(key, value, this.get(key));
}
}
del(key) {
Cookies.expire(key);
}
reset() {
try {
for (var cookie of document.cookie.split(/;\s?/)) {
Cookies.expire(cookie.split("=")[0]);
}
return;
} catch (error) {}
}
dump() {
const result = {};
for (var cookie of document.cookie.split(/;\s?/)) {
if (cookie[0] !== "_") {
cookie = cookie.split("=");
result[cookie[0]] = cookie[1];
}
}
return result;
}
}
================================================
FILE: assets/javascripts/lib/events.js
================================================
class Events {
on(event, callback) {
if (event.includes(" ")) {
for (var name of event.split(" ")) {
this.on(name, callback);
}
} else {
this._callbacks ||= {};
this._callbacks[event] ||= [];
this._callbacks[event].push(callback);
}
return this;
}
off(event, callback) {
let callbacks, index;
if (event.includes(" ")) {
for (var name of event.split(" ")) {
this.off(name, callback);
}
} else if (
(callbacks = this._callbacks?.[event]) &&
(index = callbacks.indexOf(callback)) >= 0
) {
callbacks.splice(index, 1);
if (!callbacks.length) {
delete this._callbacks[event];
}
}
return this;
}
trigger(event, ...args) {
this.eventInProgress = { name: event, args };
const callbacks = this._callbacks?.[event];
if (callbacks) {
for (const callback of callbacks.slice(0)) {
if (typeof callback === "function") {
callback(...args);
}
}
}
this.eventInProgress = null;
if (event !== "all") {
this.trigger("all", event, ...args);
}
return this;
}
removeEvent(event) {
if (this._callbacks != null) {
for (var name of event.split(" ")) {
delete this._callbacks[name];
}
}
return this;
}
}
================================================
FILE: assets/javascripts/lib/favicon.js
================================================
let defaultUrl = null;
let currentSlug = null;
const imageCache = {};
const urlCache = {};
const withImage = function (url, action) {
if (imageCache[url]) {
return action(imageCache[url]);
} else {
const img = new Image();
img.crossOrigin = "anonymous";
img.src = url;
return (img.onload = () => {
imageCache[url] = img;
return action(img);
});
}
};
this.setFaviconForDoc = function (doc) {
if (currentSlug === doc.slug || app.settings.get("noDocSpecificIcon")) {
return;
}
const favicon = $('link[rel="icon"]');
if (defaultUrl === null) {
defaultUrl = favicon.href;
}
if (urlCache[doc.slug]) {
favicon.href = urlCache[doc.slug];
currentSlug = doc.slug;
return;
}
const iconEl = $(`._icon-${doc.slug.split("~")[0]}`);
if (iconEl === null) {
return;
}
const styles = window.getComputedStyle(iconEl, ":before");
const backgroundPositionX = styles["background-position-x"];
const backgroundPositionY = styles["background-position-y"];
if (backgroundPositionX === undefined || backgroundPositionY === undefined) {
return;
}
const bgUrl = app.config.favicon_spritesheet;
const sourceSize = 16;
const sourceX = Math.abs(parseInt(backgroundPositionX.slice(0, -2)));
const sourceY = Math.abs(parseInt(backgroundPositionY.slice(0, -2)));
return withImage(bgUrl, (docImg) =>
withImage(defaultUrl, function (defaultImg) {
const size = defaultImg.width;
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
canvas.width = size;
canvas.height = size;
ctx.drawImage(defaultImg, 0, 0);
const docIconPercentage = 65;
const destinationCoords = (size / 100) * (100 - docIconPercentage);
const destinationSize = (size / 100) * docIconPercentage;
ctx.drawImage(
docImg,
sourceX,
sourceY,
sourceSize,
sourceSize,
destinationCoords,
destinationCoords,
destinationSize,
destinationSize,
);
try {
urlCache[doc.slug] = canvas.toDataURL();
favicon.href = urlCache[doc.slug];
return (currentSlug = doc.slug);
} catch (error) {
Raven.captureException(error, { level: "info" });
return this.resetFavicon();
}
}),
);
};
this.resetFavicon = function () {
if (defaultUrl !== null && currentSlug !== null) {
$('link[rel="icon"]').href = defaultUrl;
return (currentSlug = null);
}
};
================================================
FILE: assets/javascripts/lib/license.js
================================================
/*
* 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:
* http://mozilla.org/MPL/2.0/
*/
================================================
FILE: assets/javascripts/lib/local_storage_store.js
================================================
this.LocalStorageStore = class LocalStorageStore {
get(key) {
try {
return JSON.parse(localStorage.getItem(key));
} catch (error) {}
}
set(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
return true;
} catch (error) {}
}
del(key) {
try {
localStorage.removeItem(key);
return true;
} catch (error) {}
}
reset() {
try {
localStorage.clear();
return true;
} catch (error) {}
}
};
================================================
FILE: assets/javascripts/lib/page.js
================================================
/*
* Based on github.com/visionmedia/page.js
* Licensed under the MIT license
* Copyright 2012 TJ Holowaychuk <tj@vision-media.ca>
*/
let running = false;
let currentState = null;
const callbacks = [];
this.page = function (value, fn) {
if (typeof value === "function") {
page("*", value);
} else if (typeof fn === "function") {
const route = new Route(value);
callbacks.push(route.middleware(fn));
} else if (typeof value === "string") {
page.show(value, fn);
} else {
page.start(value);
}
};
page.start = function (options) {
if (options == null) {
options = {};
}
if (!running) {
running = true;
addEventListener("popstate", onpopstate);
addEventListener("click", onclick);
page.replace(currentPath(), null, null, true);
}
};
page.stop = function () {
if (running) {
running = false;
removeEventListener("click", onclick);
removeEventListener("popstate", onpopstate);
}
};
page.show = function (path, state) {
if (path === currentState?.path) {
return;
}
const context = new Context(path, state);
const previousState = currentState;
currentState = context.state;
const res = page.dispatch(context);
if (res) {
currentState = previousState;
location.assign(res);
} else {
context.pushState();
updateCanonicalLink();
track();
}
return context;
};
page.replace = function (path, state, skipDispatch, init) {
let result;
let context = new Context(path, state || currentState);
context.init = init;
currentState = context.state;
if (!skipDispatch) {
result = page.dispatch(context);
}
if (result) {
context = new Context(result);
context.init = init;
currentState = context.state;
page.dispatch(context);
}
context.replaceState();
updateCanonicalLink();
if (!skipDispatch) {
track();
}
return context;
};
page.dispatch = function (context) {
let i = 0;
const next = function () {
let fn = callbacks[i++];
return fn?.(context, next);
};
return next();
};
page.canGoBack = () => !Context.isIntialState(currentState);
page.canGoForward = () => !Context.isLastState(currentState);
const currentPath = () => location.pathname + location.search + location.hash;
class Context {
static isIntialState(state) {
return state.id === 0;
}
static isLastState(state) {
return state.id === this.stateId - 1;
}
static isInitialPopState(state) {
return state.path === this.initialPath && this.stateId === 1;
}
static isSameSession(state) {
return state.sessionId === this.sessionId;
}
constructor(path, state) {
this.initialPath = currentPath();
this.sessionId = Date.now();
this.stateId = 0;
if (path == null) {
path = "/";
}
this.path = path;
if (state == null) {
state = {};
}
this.state = state;
this.pathname = this.path.replace(
/(?:\?([^#]*))?(?:#(.*))?$/,
(_, query, hash) => {
this.query = query;
this.hash = hash;
return "";
},
);
if (this.state.id == null) {
this.state.id = this.constructor.stateId++;
}
if (this.state.sessionId == null) {
this.state.sessionId = this.constructor.sessionId;
}
this.state.path = this.path;
}
pushState() {
history.pushState(this.state, "", this.path);
}
replaceState() {
try {
history.replaceState(this.state, "", this.path);
} catch (error) {} // NS_ERROR_FAILURE in Firefox
}
}
class Route {
constructor(path, options) {
this.path = path;
if (options == null) {
options = {};
}
this.keys = [];
this.regexp = pathToRegexp(this.path, this.keys);
}
middleware(fn) {
return (context, next) => {
let params = [];
if (this.match(context.pathname, params)) {
context.params = params;
return fn(context, next);
} else {
return next();
}
};
}
match(path, params) {
const matchData = this.regexp.exec(path);
if (!matchData) {
return;
}
const iterable = matchData.slice(1);
for (let i = 0; i < iterable.length; i++) {
var key = this.keys[i];
var value = iterable[i];
if (typeof value === "string") {
value = decodeURIComponent(value);
}
if (key) {
params[key.name] = value;
} else {
params.push(value);
}
}
return true;
}
}
var pathToRegexp = function (path, keys) {
if (path instanceof RegExp) {
return path;
}
if (path instanceof Array) {
path = `(${path.join("|")})`;
}
path = path
.replace(/\/\(/g, "(?:/")
.replace(
/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g,
(_, slash, format, key, capture, optional) => {
if (slash == null) {
slash = "";
}
if (format == null) {
format = "";
}
keys.push({ name: key, optional: !!optional });
let str = optional ? "" : slash;
str += "(?:";
if (optional) {
str += slash;
}
str += format;
str += capture || (format ? "([^/.]+?)" : "([^/]+?)");
str += ")";
if (optional) {
str += optional;
}
return str;
},
)
.replace(/([\/.])/g, "\\$1")
.replace(/\*/g, "(.*)");
return new RegExp(`^${path}$`);
};
var onpopstate = function (event) {
if (!event.state || Context.isInitialPopState(event.state)) {
return;
}
if (Context.isSameSession(event.state)) {
page.replace(event.state.path, event.state);
} else {
location.reload();
}
};
var onclick = function (event) {
try {
if (
event.which !== 1 ||
event.metaKey ||
event.ctrlKey ||
event.shiftKey ||
event.defaultPrevented
) {
return;
}
} catch (error) {
return;
}
let link = $.eventTarget(event);
while (link && !(link.tagName === "A" || link.tagName === "a")) {
link = link.parentNode;
}
if (!link) return;
// If the `<a>` is in an SVG, its attributes are `SVGAnimatedString`s
// instead of strings
let href = link.href instanceof SVGAnimatedString
? new URL(link.href.baseVal, location.href).href
: link.href;
let target = link.target instanceof SVGAnimatedString
? link.target.baseVal
: link.target;
if (!target && isSameOrigin(href)) {
event.preventDefault();
let parsedHref = new URL(href);
let path = parsedHref.pathname + parsedHref.search + parsedHref.hash;
path = path.replace(/^\/\/+/, "/"); // IE11 bug
page.show(path);
}
};
var isSameOrigin = (url) =>
url.startsWith(`${location.protocol}//${location.hostname}`);
var updateCanonicalLink = function () {
if (!this.canonicalLink) {
this.canonicalLink = document.head.querySelector('link[rel="canonical"]');
}
return this.canonicalLink.setAttribute(
"href",
`https://${location.host}${location.pathname}`,
);
};
const trackers = [];
page.track = function (fn) {
trackers.push(fn);
};
var track = function () {
if (app.config.env !== "production") {
return;
}
if (navigator.doNotTrack === "1") {
return;
}
if (navigator.globalPrivacyControl) {
return;
}
const consentGiven = Cookies.get("analyticsConsent");
const consentAsked = Cookies.get("analyticsConsentAsked");
if (consentGiven === "1") {
for (var tracker of trackers) {
tracker.call();
}
} else if (consentGiven === undefined && consentAsked === undefined) {
// Only ask for consent once per browser session
Cookies.set("analyticsConsentAsked", "1");
new app.views.Notif("AnalyticsConsent", { autoHide: null });
}
};
this.resetAnalytics = function () {
for (var cookie of document.cookie.split(/;\s?/)) {
var name = cookie.split("=")[0];
if (name[0] === "_" && name[1] !== "_") {
Cookies.expire(name);
}
}
};
================================================
FILE: assets/javascripts/lib/util.js
================================================
//
// Traversing
//
let smoothDistance, smoothDuration, smoothEnd, smoothStart;
this.$ = function (selector, el) {
if (el == null) {
el = document;
}
try {
return el.querySelector(selector);
} catch (error) {}
};
this.$$ = function (selector, el) {
if (el == null) {
el = document;
}
try {
return el.querySelectorAll(selector);
} catch (error) {}
};
$.id = (id) => document.getElementById(id);
$.hasChild = function (parent, el) {
if (!parent) {
return;
}
while (el) {
if (el === parent) {
return true;
}
if (el === document.body) {
return;
}
el = el.parentNode;
}
};
$.closestLink = function (el, parent) {
if (parent == null) {
parent = document.body;
}
while (el) {
if (el.tagName === "A") {
return el;
}
if (el === parent) {
return;
}
el = el.parentNode;
}
};
//
// Events
//
$.on = function (el, event, callback, useCapture) {
if (useCapture == null) {
useCapture = false;
}
if (event.includes(" ")) {
for (var name of event.split(" ")) {
$.on(el, name, callback);
}
} else {
el.addEventListener(event, callback, useCapture);
}
};
$.off = function (el, event, callback, useCapture) {
if (useCapture == null) {
useCapture = false;
}
if (event.includes(" ")) {
for (var name of event.split(" ")) {
$.off(el, name, callback);
}
} else {
el.removeEventListener(event, callback, useCapture);
}
};
$.trigger = function (el, type, canBubble, cancelable) {
const event = new Event(type, {
bubbles: canBubble ?? true,
cancelable: cancelable ?? true,
});
el.dispatchEvent(event);
};
$.click = function (el) {
const event = new MouseEvent("click", {
bubbles: true,
cancelable: true,
});
el.dispatchEvent(event);
};
$.stopEvent = function (event) {
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
};
$.eventTarget = (event) => event.target.correspondingUseElement || event.target;
//
// Manipulation
//
const buildFragment = function (value) {
const fragment = document.createDocumentFragment();
if ($.isCollection(value)) {
for (var child of $.makeArray(value)) {
fragment.appendChild(child);
}
} else {
fragment.innerHTML = value;
}
return fragment;
};
$.append = function (el, value) {
if (typeof value === "string") {
el.insertAdjacentHTML("beforeend", value);
} else {
if ($.isCollection(value)) {
value = buildFragment(value);
}
el.appendChild(value);
}
};
$.prepend = function (el, value) {
if (!el.firstChild) {
$.append(value);
} else if (typeof value === "string") {
el.insertAdjacentHTML("afterbegin", value);
} else {
if ($.isCollection(value)) {
value = buildFragment(value);
}
el.insertBefore(value, el.firstChild);
}
};
$.before = function (el, value) {
if (typeof value === "string" || $.isCollection(value)) {
value = buildFragment(value);
}
el.parentNode.insertBefore(value, el);
};
$.after = function (el, value) {
if (typeof value === "string" || $.isCollection(value)) {
value = buildFragment(value);
}
if (el.nextSibling) {
el.parentNode.insertBefore(value, el.nextSibling);
} else {
el.parentNode.appendChild(value);
}
};
$.remove = function (value) {
if ($.isCollection(value)) {
for (var el of $.makeArray(value)) {
if (el.parentNode != null) {
el.parentNode.removeChild(el);
}
}
} else {
if (value.parentNode != null) {
value.parentNode.removeChild(value);
}
}
};
$.empty = function (el) {
while (el.firstChild) {
el.removeChild(el.firstChild);
}
};
// Calls the function while the element is off the DOM to avoid triggering
// unnecessary reflows and repaints.
$.batchUpdate = function (el, fn) {
const parent = el.parentNode;
const sibling = el.nextSibling;
parent.removeChild(el);
fn(el);
if (sibling) {
parent.insertBefore(el, sibling);
} else {
parent.appendChild(el);
}
};
//
// Offset
//
$.rect = (el) => el.getBoundingClientRect();
$.offset = function (el, container) {
if (container == null) {
container = document.body;
}
let top = 0;
let left = 0;
while (el && el !== container) {
top += el.offsetTop;
left += el.offsetLeft;
el = el.offsetParent;
}
return {
top,
left,
};
};
$.scrollParent = function (el) {
while ((el = el.parentNode) && el.nodeType === 1) {
if (el.scrollTop > 0) {
break;
}
if (["auto", "scroll"].includes(getComputedStyle(el)?.overflowY ?? "")) {
break;
}
}
return el;
};
$.scrollTo = function (el, parent, position, options) {
if (position == null) {
position = "center";
}
if (options == null) {
options = {};
}
if (!el) {
return;
}
if (parent == null) {
parent = $.scrollParent(el);
}
if (!parent) {
return;
}
const parentHeight = parent.clientHeight;
const parentScrollHeight = parent.scrollHeight;
if (!(parentScrollHeight > parentHeight)) {
return;
}
const { top } = $.offset(el, parent);
const { offsetTop } = parent.firstElementChild;
switch (position) {
case "top":
parent.scrollTop = top - offsetTop - (options.margin || 0);
break;
case "center":
parent.scrollTop =
top - Math.round(parentHeight / 2 - el.offsetHeight / 2);
break;
case "continuous":
var { scrollTop } = parent;
var height = el.offsetHeight;
var lastElementOffset =
parent.lastElementChild.offsetTop +
parent.lastElementChild.offsetHeight;
var offsetBottom =
lastElementOffset > 0 ? parentScrollHeight - lastElementOffset : 0;
// If the target element is above the visible portion of its scrollable
// ancestor, move it near the top with a gap = options.topGap * target's height.
if (top - offsetTop <= scrollTop + height * (options.topGap || 1)) {
parent.scrollTop = top - offsetTop - height * (options.topGap || 1);
// If the target element is below the visible portion of its scrollable
// ancestor, move it near the bottom with a gap = options.bottomGap * target's height.
} else if (
top + offsetBottom >=
scrollTop + parentHeight - height * ((options.bottomGap || 1) + 1)
) {
parent.scrollTop =
top +
offsetBottom -
parentHeight +
height * ((options.bottomGap || 1) + 1);
}
break;
}
};
$.scrollToWithImageLock = function (el, parent, ...args) {
if (parent == null) {
parent = $.scrollParent(el);
}
if (!parent) {
return;
}
$.scrollTo(el, parent, ...args);
// Lock the scroll position on the target element for up to 3 seconds while
// nearby images are loaded and rendered.
for (var image of parent.getElementsByTagName("img")) {
if (!image.complete) {
(function () {
let timeout;
const onLoad = function (event) {
clearTimeout(timeout);
unbind(event.target);
return $.scrollTo(el, parent, ...args);
};
var unbind = (target) => $.off(target, "load", onLoad);
$.on(image, "load", onLoad);
return (timeout = setTimeout(unbind.bind(null, image), 3000));
})();
}
}
};
// Calls the function while locking the element's position relative to the window.
$.lockScroll = function (el, fn) {
const parent = $.scrollParent(el);
if (parent) {
let { top } = $.rect(el);
if (![document.body, document.documentElement].includes(parent)) {
top -= $.rect(parent).top;
}
fn();
parent.scrollTop = $.offset(el, parent).top - top;
} else {
fn();
}
};
// If `el` is inside any `<details>` elements, expand them.
$.openDetailsAncestors = function (el) {
while (el) {
if (el.tagName === "DETAILS") {
el.open = true;
}
el = el.parentElement;
}
}
let smoothScroll =
(smoothStart =
smoothEnd =
smoothDistance =
smoothDuration =
null);
$.smoothScroll = function (el, end) {
smoothEnd = end;
if (smoothScroll) {
const newDistance = smoothEnd - smoothStart;
smoothDuration += Math.min(300, Math.abs(smoothDistance - newDistance));
smoothDistance = newDistance;
return;
}
smoothStart = el.scrollTop;
smoothDistance = smoothEnd - smoothStart;
smoothDuration = Math.min(300, Math.abs(smoothDistance));
const startTime = Date.now();
smoothScroll = function () {
const p = Math.min(1, (Date.now() - startTime) / smoothDuration);
const y = Math.max(
0,
Math.floor(
smoothStart +
smoothDistance * (p < 0.5 ? 2 * p * p : p * (4 - p * 2) - 1),
),
);
el.scrollTop = y;
if (p === 1) {
return (smoothScroll = null);
} else {
return requestAnimationFrame(smoothScroll);
}
};
return requestAnimationFrame(smoothScroll);
};
//
// Utilities
//
$.makeArray = function (object) {
if (Array.isArray(object)) {
return object;
} else {
return Array.prototype.slice.apply(object);
}
};
$.arrayDelete = function (array, object) {
const index = array.indexOf(object);
if (index >= 0) {
array.splice(index, 1);
return true;
} else {
return false;
}
};
// Returns true if the object is an array or a collection of DOM elements.
$.isCollection = (object) =>
Array.isArray(object) || typeof object?.item === "function";
const ESCAPE_HTML_MAP = {
"&": "&",
"<": "<",
">": ">",
'"': """,
"'": "'",
"/": "/",
};
const ESCAPE_HTML_REGEXP = /[&<>"'\/]/g;
$.escape = (string) =>
string.replace(ESCAPE_HTML_REGEXP, (match) => ESCAPE_HTML_MAP[match]);
const ESCAPE_REGEXP = /([.*+?^=!:${}()|\[\]\/\\])/g;
$.escapeRegexp = (string) => string.replace(ESCAPE_REGEXP, "\\$1");
$.urlDecode = (string) => decodeURIComponent(string.replace(/\+/g, "%20"));
$.classify = function (string) {
string = string.split("_");
for (let i = 0; i < string.length; i++) {
var substr = string[i];
string[i] = substr[0].toUpperCase() + substr.slice(1);
}
return string.join("");
};
//
// Miscellaneous
//
$.noop = function () {};
$.popup = function (value) {
try {
window.open(value.href || value, "_blank", "noopener");
} catch (error) {
const win = window.open();
if (win.opener) {
win.opener = null;
}
win.location = value.href || value;
}
};
let isMac = null;
$.isMac = () =>
isMac != null ? isMac : (isMac = navigator.userAgent.includes("Mac"));
let isIE = null;
$.isIE = () =>
isIE != null
? isIE
: (isIE =
navigator.userAgent.includes("MSIE") ||
navigator.userAgent.includes("rv:11.0"));
let isChromeForAndroid = null;
$.isChromeForAndroid = () =>
isChromeForAndroid != null
? isChromeForAndroid
: (isChromeForAndroid =
navigator.userAgent.includes("Android") &&
/Chrome\/([.0-9])+ Mobile/.test(navigator.userAgent));
let isAndroid = null;
$.isAndroid = () =>
isAndroid != null
? isAndroid
: (isAndroid = navigator.userAgent.includes("Android"));
let isIOS = null;
$.isIOS = () =>
isIOS != null
? isIOS
: (isIOS =
navigator.userAgent.includes("iPhone") ||
navigator.userAgent.includes("iPad"));
$.overlayScrollbarsEnabled = function () {
if (!$.isMac()) {
return false;
}
const div = document.createElement("div");
div.setAttribute(
"style",
"width: 100px; height: 100px; overflow: scroll; position: absolute",
);
document.body.appendChild(div);
const result = div.offsetWidth === div.clientWidth;
document.body.removeChild(div);
return result;
};
const HIGHLIGHT_DEFAULTS = {
className: "highlight",
delay: 1000,
};
$.highlight = function (el, options) {
options = { ...HIGHLIGHT_DEFAULTS, ...(options || {}) };
el.classList.add(options.className);
setTimeout(() => el.classList.remove(options.className), options.delay);
};
================================================
FILE: assets/javascripts/models/doc.js
================================================
app.models.Doc = class Doc extends app.Model {
// Attributes: name, slug, type, version, release, db_size, mtime, links
constructor() {
super(...arguments);
this.reset(this);
this.slug_without_version = this.slug.split("~")[0];
this.fullName = `${this.name}` + (this.version ? ` ${this.version}` : "");
this.icon = this.slug_without_version;
if (this.version) {
this.short_version = this.version.split(" ")[0];
}
this.text = this.toEntry().text;
}
reset(data) {
this.resetEntries(data.entries);
this.resetTypes(data.types);
}
resetEntries(entries) {
this.entries = new app.collections.Entries(entries);
this.entries.each((entry) => {
return (entry.doc = this);
});
}
resetTypes(types) {
this.types = new app.collections.Types(types);
this.types.each((type) => {
return (type.doc = this);
});
}
fullPath(path) {
if (path == null) {
path = "";
}
if (path[0] !== "/") {
path = `/${path}`;
}
return `/${this.slug}${path}`;
}
fileUrl(path) {
return `${app.config.docs_origin}${this.fullPath(path)}?${this.mtime}`;
}
dbUrl() {
return `${app.config.docs_origin}/${this.slug}/${app.config.db_filename}?${this.mtime}`;
}
indexUrl() {
return `${app.indexHost()}/${this.slug}/${app.config.index_filename}?${
this.mtime
}`;
}
toEntry() {
if (this.entry) {
return this.entry;
}
this.entry = new app.models.Entry({
doc: this,
name: this.fullName,
path: "index",
});
if (this.version) {
this.entry.addAlias(this.name);
}
return this.entry;
}
findEntryByPathAndHash(path, hash) {
const entry = hash && this.entries.findBy("path", `${path}#${hash}`);
if (entry) {
return entry;
} else if (path === "index") {
return this.toEntry();
} else {
return this.entries.findBy("path", path);
}
}
load(onSuccess, onError, options) {
if (options == null) {
options = {};
}
if (options.readCache && this._loadFromCache(onSuccess)) {
return;
}
const callback = (data) => {
this.reset(data);
onSuccess();
if (options.writeCache) {
this._setCache(data);
}
};
return ajax({
url: this.indexUrl(),
success: callback,
error: onError,
});
}
clearCache() {
app.localStorage.del(this.slug);
}
_loadFromCache(onSuccess) {
const data = this._getCache();
if (!data) {
return;
}
const callback = () => {
this.reset(data);
onSuccess();
};
setTimeout(callback, 0);
return true;
}
_getCache() {
const data = app.localStorage.get(this.slug);
if (!data) {
return;
}
if (data[0] === this.mtime) {
return data[1];
} else {
this.clearCache();
return;
}
}
_setCache(data) {
app.localStorage.set(this.slug, [this.mtime, data]);
}
install(onSuccess, onError, onProgress) {
if (this.installing) {
return;
}
this.installing = true;
const error = () => {
this.installing = null;
onError();
};
const success = (data) => {
this.installing = null;
app.db.store(this, data, onSuccess, error);
};
ajax({
url: this.dbUrl(),
success,
error,
progress: onProgress,
timeout: 3600,
});
}
uninstall(onSuccess, onError) {
if (this.installing) {
return;
}
this.installing = true;
const success = () => {
this.installing = null;
onSuccess();
};
const error = () => {
this.installing = null;
onError();
};
app.db.unstore(this, success, error);
}
getInstallStatus(callback) {
app.db.version(this, (value) =>
callback({ installed: !!value, mtime: value }),
);
}
isOutdated(status) {
if (!status) {
return false;
}
const isInstalled = status.installed || app.settings.get("autoInstall");
return isInstalled && this.mtime !== status.mtime;
}
};
================================================
FILE: assets/javascripts/models/entry.js
================================================
//= require app/searcher
app.models.Entry = class Entry extends app.Model {
static applyAliases(string) {
const aliases = app.config.docs_aliases;
if (aliases.hasOwnProperty(string)) {
return [string, aliases[string]];
} else {
const words = string.split(".");
for (let i = 0; i < words.length; i++) {
var word = words[i];
if (aliases.hasOwnProperty(word)) {
words[i] = aliases[word];
return [string, words.join(".")];
}
}
}
return string;
}
// Attributes: name, type, path
constructor() {
super(...arguments);
this.text = Entry.applyAliases(app.Searcher.normalizeString(this.name));
}
addAlias(name) {
const text = Entry.applyAliases(app.Searcher.normalizeString(name));
if (!Array.isArray(this.text)) {
this.text = [this.text];
}
this.text.push(Array.isArray(text) ? text[1] : text);
}
fullPath() {
return this.doc.fullPath(this.isIndex() ? "" : this.path);
}
dbPath() {
return this.path.replace(/#.*/, "");
}
filePath() {
return this.doc.fullPath(this._filePath());
}
fileUrl() {
return this.doc.fileUrl(this._filePath());
}
_filePath() {
let result = this.path.replace(/#.*/, "");
if (result.slice(-5) !== ".html") {
result += ".html";
}
return result;
}
isIndex() {
return this.path === "index";
}
getType() {
return this.doc.types.findBy("name", this.type);
}
loadFile(onSuccess, onError) {
return app.db.load(this, onSuccess, onError);
}
};
================================================
FILE: assets/javascripts/models/model.js
================================================
app.Model = class Model {
constructor(attributes) {
for (var key in attributes) {
var value = attributes[key];
this[key] = value;
}
}
};
================================================
FILE: assets/javascripts/models/type.js
================================================
app.models.Type = class Type extends app.Model {
// Attributes: name, slug, count
fullPath() {
return `/${this.doc.slug}-${this.slug}/`;
}
entries() {
return this.doc.entries.findAllBy("type", this.name);
}
toEntry() {
return new app.models.Entry({
doc: this.doc,
name: `${this.doc.name} / ${this.name}`,
path: ".." + this.fullPath(),
});
}
};
================================================
FILE: assets/javascripts/news.json
================================================
[
[
"2026-02-14",
"New documentation: <a href=\"/couchdb/\">CouchDB</a>"
],
[
"2025-10-19",
"New documentations: <a href=\"/lit/\">Lit</a>, <a href=\"/graphviz/\">Graphviz</a>, <a href=\"/bun/\">Bun</a>"
],
[
"2025-07-14",
"New documentation: <a href=\"/tcllib/\">Tcllib</a>"
],
[
"2025-06-27",
"New documentation: <a href=\"/zsh/\">Zsh</a>"
],
[
"2025-06-04",
"New documentation: <a href=\"/es_toolkit/\">es-toolkit</a>"
],
[
"2025-05-28",
"New documentation: <a href=\"/vertx/\">Vert.x</a>"
],
[
"2025-02-23",
"New documentation: <a href=\"/threejs/\">Three.js</a>"
],
[
"2025-02-16",
"New documentation: <a href=\"/openlayers/\">OpenLayers</a>"
],
[
"2024-11-23",
"New documentation: <a href=\"/duckdb/\">DuckDB</a>"
],
[
"2024-08-20",
"New documentation: <a href=\"/man/\">Linux man pages</a>"
],
[
"2024-07-28",
"New documentation: <a href=\"/opengl/\">OpenGL</a>"
],
[
"2024-06-12",
"New documentations: <a href=\"/nextjs/\">Next.js</a>, <a href=\"/click/\">click</a>"
],
[
"2024-01-24",
"New documentation: <a href=\"/playwright/\">Playwright</a>"
],
[
"2024-01-20",
"New documentation: <a href=\"/htmx/\">htmx</a>"
],
[
"2024-01-12",
"New documentation: <a href=\"/hammerspoon/\">Hammerspoon</a>"
],
[
"2024-01-05",
"New documentation: <a href=\"/bazel/\">Bazel</a>"
],
[
"2023-10-09",
"New documentations: <a href=\"/hapi/\">hapi</a>, <a href=\"/joi/\">joi</a>, <a href=\"/nushell/\">Nushell</a>, <a href=\"/varnish/\">Varnish</a>"
],
[
"2023-08-24",
"New documentation: <a href=\"/fluture/\">Fluture</a>"
],
[
"2022-12-20",
"New documentations: <a href=\"/qunit/\">QUnit</a>, <a href=\"/wagtail/\">Wagtail</a>"
],
[
"2022-11-04",
"New documentation: <a href=\"/vueuse/\">VueUse</a>"
],
[
"2022-10-10",
"New documentation: <a href=\"/astro/\">Astro</a>"
],
[
"2022-10-09",
"New documentations: <a href=\"/fastapi/\">FastAPI</a>, <a href=\"/vitest/\">Vitest</a>"
],
[
"2022-10-02",
"New documentation: <a href=\"/svelte/\">Svelte</a>"
],
[
"2022-09-21",
"Added HTTP/3 to <a href=\"/http/\">HTTP</a>"
],
[
"2022-09-06",
"New documentation: <a href=\"/date_fns/\">date-fns</a>"
],
[
"2022-08-27",
"New documentations: <a href=\"/sanctuary/\">Sanctuary</a>, <a href=\"/requests/\">Requests</a>, <a href=\"/axios/\">Axios</a>"
],
[
"2022-05-03",
"New documentations: <a href=\"/kubernetes/\">Kubernetes</a>, <a href=\"/kubectl/\">Kubectl</a>"
],
[
"2022-04-25",
"New documentation: <a href=\"/nix/\">Nix</a>"
],
[
"2022-03-31",
"New documentation: <a href=\"/eigen3/\">Eigen3</a>"
],
[
"2022-02-21",
"New documentation: <a href=\"/tailwindcss/\">Tailwind CSS</a>"
],
[
"2022-01-12",
"New documentation: <a href=\"/react_router/\">React Router</a>"
],
[
"2022-01-09",
"New documentation: <a href=\"/deno/\">Deno</a>"
],
[
"2021-12-29",
"New documentation: <a href=\"/point_cloud_library/\">PointCloudLibrary</a>"
],
[
"2021-12-27",
"New documentation: <a href=\"/zig/\">Zig</a>"
],
[
"2021-12-26",
"New documentation: <a href=\"/gnu_make/\">GNU Make</a>"
],
[
"2021-12-07",
"New documentation: <a href=\"/prettier/\">Prettier</a>",
"Renamed documentation: <a href=\"/dom/\">Web APIs</a>"
],
[
"2021-12-05",
"New documentation: <a href=\"/esbuild/\">esbuild</a>"
],
[
"2021-12-04",
"New documentation: <a href=\"/vite/\">Vite</a>"
],
[
"2021-11-29",
"New documentation: <a href=\"/i3/\">i3</a>"
],
[
"2021-06-09",
"New documentation: <a href=\"/r/\">R</a>"
],
[
"2021-05-31",
"New documentation: <a href=\"/web_extensions/\">Web Extensions</a>"
],
[
"2021-05-26",
"New documentations: <a href=\"/latex/\">LaTeX</a>, <a href=\"/jq/\">jq</a>"
],
[
"2021-04-29",
"Added <code class=\"_label\">alt + c</code> shortcut to copy URL of original page."
],
[
"2021-02-26",
"New documentation: <a href=\"/react_bootstrap/\">React Bootstrap</a>"
],
[
"2021-01-03",
"New documentation: <a href=\"/ocaml/\">OCaml</a>"
],
[
"2020-12-23",
"New documentation: <a href=\"/gtk/\">GTK</a>"
],
[
"2020-12-07",
"New documentations: <a href=\"/flask/\">Flask</a>, <a href=\"/groovy/\">Groovy</a>, <a href=\"/jinja/\">Jinja</a>, <a href=\"/werkzeug/\">Werkzeug</a>"
],
[
"2020-12-04",
"New documentation: <a href=\"/haproxy/\">HAProxy</a>"
],
[
"2020-11-17",
"TensorFlow has been split into <a href=\"/tensorflow/\">TensorFlow Python</a>, <a href=\"/tensorflow_cpp/\">TensorFlow C++</a>"
],
[
"2020-11-14",
"New documentations: <a href=\"/pytorch/\">PyTorch</a>, <a href=\"/spring_boot/\">Spring Boot</a>"
],
[
"2020-01-13",
"New “Automatic” theme: match your browser or system dark mode setting. <a href=\"/settings\">Enable it in preferences</a>."
],
[
"2020-01-13",
"New documentation: <a href=\"/gnuplot/\">Gnuplot</a>"
],
[
"2019-10-26",
"New documentation: <a href=\"/sequelize/\">Sequelize</a>"
], [
"2019-10-20",
"New documentations: <a href=\"/mariadb/\">MariaDB</a> and <a href=\"/reactivex/\">ReactiveX</a>"
], [
"2019-09-02",
"New documentations added over the last 3 weeks: <a href=\"/scala~2.13_library/\">Scala</a>, <a href=\"/wordpress/\">WordPress</a>, <a href=\"/cypress/\">Cypress</a>, <a href=\"/saltstack/\">SaltStack</a>, <a href=\"/composer/\">Composer</a>, <a href=\"/vue_router/\">Vue Router</a>, <a href=\"/vuex/\">Vuex</a>, <a href=\"/pony/\">Pony</a>, <a href=\"/rxjs/\">RxJS</a>, <a href=\"/octave/\">Octave</a>, <a href=\"/trio/\">Trio</a>, <a href=\"/django_rest_framework/\">Django REST Framework</a>, <a href=\"/enzyme/\">Enzyme</a> and <a href=\"/gnu_cobol/\">GnuCOBOL</a>"
], [
"2019-07-21",
"Fixed several bugs, added an option to automatically download documentation and <a href=\"https://github.com/freeCodeCamp/devdocs/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aclosed+sort%3Aupdated-desc+closed%3A%3E2019-07-18+977+988+986+870+886+1024+979+975+941+831+1005+848+942\" target=\"_blank\">more</a>."
], [
"2019-07-19",
"Replaced the AppCache with a Service Worker (which makes DevDocs an installable PWA) and fixed layout preferences on Firefox."
], [
"2018-09-23",
"New documentations: <a href=\"/puppeteer/\">Puppeteer</a> and <a href=\"/handlebars/\">Handlebars.js</a>"
], [
"2018-08-12",
"New documentations: <a href=\"/dart/\">Dart</a> and <a href=\"/qt/\">Qt</a>"
], [
"2018-07-29",
"New documentations: <a href=\"/bash/\">Bash</a>, <a href=\"/graphite/\">Graphite</a> and <a href=\"/pygame/\">Pygame</a>"
], [
"2018-07-08",
"New documentations: <a href=\"/leaflet/\">Leaflet</a>, <a href=\"/terraform/\">Terraform</a> and <a href=\"/koa/\">Koa</a>"
], [
"2018-03-26",
"DevDocs is joining the freeCodeCamp community. Read the announcement <a href=\"https://medium.freecodecamp.org/devdocs-is-joining-the-freecodecamp-community-ae185a1c14a6\" target=\"_blank\">here</a>."
], [
"2018-02-04",
"New documentations: <a href=\"/babel/\">Babel</a>, <a href=\"/jekyll/\">Jekyll</a> and <a href=\"/jsdoc/\">JSDoc</a>"
], [
"2017-11-26",
"New documentations: <a href=\"/bluebird/\">Bluebird</a>, <a href=\"/eslint/\">ESLint</a> and <a href=\"/homebrew/\">Homebrew</a>"
], [
"2017-11-18",
"Added print & PDF stylesheet.\nFeedback welcome on <a href=\"https://twitter.com/DevDocs\" target=\"_blank\" rel=\"noopener\">Twitter</a> and <a href=\"https://github.com/freeCodeCamp/devdocs\" target=\"_blank\" rel=\"noopener\">GitHub</a>."
], [
"2017-09-10",
"<a href=\"/settings\">Preferences</a> can now be exported and imported."
], [
"2017-09-03",
"New documentations: <a href=\"/d/\">D</a>, <a href=\"/nim/\">Nim</a> and <a href=\"/vulkan/\">Vulkan</a>"
], [
"2017-07-23",
"New documentation: <a href=\"/godot/\">Godot</a>"
], [
"2017-06-04",
"New documentations: <a href=\"/electron/\">Electron</a>, <a href=\"/pug/\">Pug</a>, and <a href=\"/falcon/\">Falcon</a>"
], [
"2017-05-14",
"New documentations: <a href=\"/jest/\">Jest</a>, <a href=\"/jasmine/\">Jasmine</a> and <a href=\"/liquid/\">Liquid</a>"
], [
"2017-04-30",
"New documentation: <a href=\"/openjdk/\">OpenJDK</a>"
], [
"2017-02-26",
"Refreshed design.",
"Added <a href=\"/settings\">Preferences</a>."
], [
"2017-01-22",
"New <a href=\"/http/\">HTTP</a> documentation (thanks Mozilla)"
], [
"2016-12-04",
"New documentations: <a href=\"/sqlite/\">SQLite</a>, <a href=\"/codeception/\">Codeception</a> and <a href=\"/codeceptjs/\">CodeceptJS</a>"
], [
"2016-11-20",
"New documentations: <a href=\"/yarn/\">Yarn</a>, <a href=\"/immutable/\">Immutable.js</a> and <a href=\"/async/\">Async</a>"
], [
"2016-10-10",
"New documentations: <a href=\"/scikit_learn/\">scikit-learn</a> and <a href=\"/statsmodels/\">Statsmodels</a>"
], [
"2016-09-18",
"New documentations: <a href=\"/pandas/\">pandas</a> and <a href=\"/twig/\">Twig</a>"
], [
"2016-09-05",
"New documentations: <a href=\"/fish/\">Fish</a>, <a href=\"/bottle/\">Bottle</a> and <a href=\"/scikit_image/\">scikit-image</a>"
], [
"2016-08-07",
"New documentation: <a href=\"/docker/\">Docker</a>"
], [
"2016-07-31",
"New documentations: <a href=\"/bootstrap~3/\">Bootstrap 3</a> and <a href=\"/bootstrap~4/\">Bootstrap 4</a>"
], [
"2016-07-24",
"New documentations: <a href=\"/julia/\">Julia</a>, <a href=\"/crystal/\">Crystal</a> and <a href=\"/redux/\">Redux</a>"
], [
"2016-07-03",
"New documentations: <a href=\"/cmake/\">CMake</a> and <a href=\"/matplotlib/\">Matplotlib</a>"
], [
"2016-06-19",
"New documentation: <a href=\"/love/\">LÖVE</a>"
], [
"2016-06-12",
"New documentation: <a href=\"/angular/\">Angular 2</a>"
], [
"2016-06-05",
"New documentations: <a href=\"/kotlin/\">Kotlin</a> and <a href=\"/padrino/\">Padrino</a>"
], [
"2016-04-24",
"New documentations: <a href=\"/numpy/\">NumPy</a> and <a href=\"/apache_pig/\">Apache Pig</a>"
], [
"2016-04-17",
"New documentation: <a href=\"/perl/\">Perl</a>"
], [
"2016-04-10",
"New documentations: <a href=\"/browser_support_tables/\">Support tables (caniuse.com)</a>, <a href=\"/gcc/\">GCC</a> and <a href=\"/gnu_fortran/\">GNU Fortran</a>"
], [
"2016-03-27",
"New documentation: <a href=\"/typescript/\">TypeScript</a>"
], [
"2016-03-06",
"New documentations: <a href=\"/tensorflow/\">TensorFlow</a>, <a href=\"/haxe/\">Haxe</a> and <a href=\"/ansible/\">Ansible</a>"
], [
"2016-02-28",
"New documentations: <a href=\"/codeigniter/\">CodeIgniter</a>, <a href=\"/nginx_lua_module/\">nginx Lua Module</a> and <a href=\"/influxdata/\">InfluxData</a>"
], [
"2016-02-15",
"New documentations: <a href=\"/cakephp/\">CakePHP</a>, <a href=\"/chef/\">Chef</a> and <a href=\"/ramda/\">Ramda</a>"
], [
"2016-01-31",
"New documentations: <a href=\"/erlang/\">Erlang</a> and <a href=\"/tcl_tk/\">Tcl/Tk</a>"
], [
"2016-01-24",
"“Multi-version support” has landed!"
], [
"2015-11-22",
"New documentations: <a href=\"/phoenix/\">Phoenix</a>, <a href=\"/dojo/\">Dojo</a>, <a href=\"/relay/\">Relay</a> and <a href=\"/flow/\">Flow</a>"
], [
"2015-11-08",
"New documentations: <a href=\"/elixir/\">Elixir</a> and <a href=\"/vagrant/\">Vagrant</a>"
], [
"2015-10-18",
"Added a \"Copy to clipboard\" button inside each code block."
], [
"2015-09-13",
"New documentation: <a href=\"/phalcon/\">Phalcon</a>"
], [
"2015-08-09",
"New documentation: <a href=\"/react_native/\">React Native</a>"
], [
"2015-08-03",
"Added an icon in the sidebar to constrain the width of the UI (visible when applicable)."
], [
"2015-08-02",
"New documentations: <a href=\"/q/\">Q</a> and <a href=\"/opentsdb/\">OpenTSDB</a>"
], [
"2015-07-26",
"Added search aliases (e.g. <code class=\"_label\">$</code> is an alias for <code class=\"_label\">jQuery</code>).\n<a href=\"/help#aliases\">Click here</a> to see the full list. Feel free to suggest more on <a href=\"https://github.com/freeCodeCamp/devdocs/issues/new\" target=\"_blank\" rel=\"noopener\">GitHub</a>.",
"Added <code class=\"_label\">shift + ↓/↑</code> shortcut for scrolling (same as <code class=\"_label\">alt + ↓/↑</code>)."
], [
"2015-07-05",
"New documentations: <a href=\"/drupal/\">Drupal</a>, <a href=\"/vue/\">Vue.js</a>, <a href=\"/phaser/\">Phaser</a> and <a href=\"/webpack/\">webpack</a>"
], [
"2015-05-24",
"New <a href=\"/rust/\">Rust</a> documentation"
], [
"2015-04-26",
"New <a href=\"/apache_http_server/\">Apache HTTP Server</a> and <a href=\"/npm/\">npm</a> documentations"
], [
"2015-03-22",
"New <a href=\"/meteor/\">Meteor</a> and <a href=\"/mocha/\">mocha</a> documentations"
], [
"2015-02-22",
"Improved <a href=\"/http/\">HTTP</a> documentation",
"New <a href=\"/minitest/\">Minitest</a> documentation"
], [
"2015-02-16",
"The sidebar is now resizable (drag & drop)."
], [
"2015-02-15",
"New <a href=\"/iojs/\">io.js</a>, <a href=\"/symfony/\">Symfony</a>, <a href=\"/clojure/\">Clojure</a>, <a href=\"/lua/\">Lua</a> and <a href=\"/yii1/\">Yii 1.1</a> documentations"
], [
"2015-02-08",
"New dark theme"
], [
"2015-01-13",
"<a href=\"/offline\">Offline mode</a> has landed!"
], [
"2014-12-21",
"New <a href=\"/react/\">React</a>, <a href=\"/rethinkdb/\">RethinkDB</a>, <a href=\"/socketio/\">Socket.IO</a>, <a href=\"/modernizr/\">Modernizr</a> and <a href=\"/bower/\">Bower</a> documentations"
], [
"2014-11-30",
"New <a href=\"/phpunit/\">PHPUnit</a> and <a href=\"/nokogiri/\">Nokogiri</a> documentations"
], [
"2014-11-16",
"New <a href=\"/python2/\">Python 2</a> documentation"
], [
"2014-11-09",
"New design\nFeedback welcome on <a href=\"https://twitter.com/DevDocs\" target=\"_blank\" rel=\"noopener\">Twitter</a> and <a href=\"https://github.com/freeCodeCamp/devdocs\" target=\"_blank\" rel=\"noopener\">GitHub</a>."
], [
"2014-10-19",
"New <a href=\"/svg/\">SVG</a>, <a href=\"/marionette/\">Marionette.js</a>, and <a href=\"/mongoose/\">Mongoose</a> documentations"
], [
"2014-10-18",
"New <a href=\"/nginx/\">nginx</a> documentation"
], [
"2014-10-13",
"New <a href=\"/xpath/\">XPath</a> documentation"
], [
"2014-09-07",
"Updated the HTML, CSS, JavaScript, and DOM documentations with additional content."
], [
"2014-08-04",
"New <a href=\"/django/\">Django</a> documentation"
], [
"2014-07-27",
"New <a href=\"/markdown/\">Markdown</a> documentation"
], [
"2014-07-05",
"New <a href=\"/cordova/\">Cordova</a> documentation"
], [
"2014-07-01",
"New <a href=\"/chai/\">Chai</a> and <a href=\"/sinon/\">Sinon</a> documentations"
], [
"2014-06-15",
"New <a href=\"/requirejs/\">RequireJS</a> documentation"
], [
"2014-06-14",
"New <a href=\"/haskell/\">Haskell</a> documentation"
], [
"2014-05-25",
"New <a href=\"/laravel/\">Laravel</a> documentation"
], [
"2014-05-04",
"New <a href=\"/express/\">Express</a>, <a href=\"/grunt/\">Grunt</a>, and <a href=\"/maxcdn/\">MaxCDN</a> documentations"
], [
"2014-04-06",
"New <a href=\"/go/\">Go</a> documentation"
], [
"2014-03-30",
"New <a href=\"/cpp/\">C++</a> documentation"
], [
"2014-03-16",
"New <a href=\"/yii/\">Yii</a> documentation"
], [
"2014-03-08",
"Added path bar."
], [
"2014-02-22",
"New <a href=\"/c/\">C</a> documentation"
], [
"2014-02-16",
"New <a href=\"/moment/\">Moment.js</a> documentation"
], [
"2014-02-12",
"The root/category pages are now included in the search index (e.g. <a href=\"/#q=CSS\">CSS</a>)"
], [
"2014-01-19",
"New <a href=\"/d3/\">D3.js</a> and <a href=\"/knockout/\">Knockout.js</a> documentations"
], [
"2014-01-18",
"DevDocs is now available as a <a href=\"https://marketplace.firefox.com/app/devdocs/\">Firefox web app</a>."
], [
"2014-01-12",
"Added <code class=\"_label\">alt + g</code> shortcut for searching on Google.",
"Added <code class=\"_label\">alt + r</code> shortcut for revealing the current page in the sidebar."
], [
"2013-12-14",
"New <a href=\"/postgresql/\">PostgreSQL</a> documentation"
], [
"2013-12-13",
"New <a href=\"/git/\">Git</a> and <a href=\"/redis/\">Redis</a> documentations"
], [
"2013-11-26",
"New <a href=\"/python/\">Python</a> documentation"
], [
"2013-11-19",
"New <a href=\"/rails/\">Ruby on Rails</a> documentation"
], [
"2013-11-16",
"New <a href=\"/ruby/\">Ruby</a> documentation"
], [
"2013-10-24",
"DevDocs is now <a href=\"https://github.com/freeCodeCamp/devdocs\">open source</a>."
], [
"2013-10-09",
"DevDocs is now available as a <a href=\"https://chrome.google.com/webstore/detail/devdocs/mnfehgbmkapmjnhcnbodoamcioleeooe\">Chrome web app</a>."
], [
"2013-09-22",
"New <a href=\"/php/\">PHP</a> documentation"
], [
"2013-09-06",
"New <a href=\"/lodash/\">Lo-Dash</a> documentation ",
"On mobile devices you can now search a specific documentation by typing its name and <code class=\"_label\">Space</code>."
], [
"2013-09-01",
"New <a href=\"/jqueryui/\">jQuery UI</a> and <a href=\"/jquerymobile/\">jQuery Mobile</a> documentations"
], [
"2013-08-28",
"New smartphone interface\nTested on iOS 6+ and Android 4.1+"
], [
"2013-08-25",
"New <a href=\"/ember/\">Ember.js</a> documentation"
], [
"2013-08-18",
"New <a href=\"/coffeescript/\">CoffeeScript</a> documentation",
"URL search now automatically opens the first result."
], [
"2013-08-13",
"New <a href=\"/angularjs/\">Angular.js</a> documentation"
], [
"2013-08-11",
"New <a href=\"/sass/\">Sass</a> and <a href=\"/less/\">Less</a> documentations"
], [
"2013-08-05",
"New <a href=\"/node/\">Node.js</a> documentation"
], [
"2013-08-03",
"Added support for OpenSearch"
], [
"2013-07-30",
"New <a href=\"/backbone/\">Backbone.js</a> documentation"
], [
"2013-07-27",
"You can now customize the list of documentations.\nNew docs will be hidden by default, but you'll see a notification when there are new releases.",
"New <a href=\"/http/\">HTTP</a> documentation"
], [
"2013-07-15",
"URL search now works with single documentations: <a href=\"/#q=js%20sort\">devdocs.io/#q=js sort</a>"
], [
"2013-07-13",
"Added syntax highlighting",
"Added documentation versions"
], [
"2013-07-11",
"New <a href=\"/underscore/\">Underscore.js</a> documentation ",
"Improved compatibility with tablets\nA mobile version is planned as soon as other high priority features have been implemented."
], [
"2013-07-10",
"You can now search specific documentations.\nSimply type the documentation's name and press <code class=\"_label\">Tab</code>.\nThe name is fuzzy matched so you can use abbreviations like <code>js</code> for <code>JavaScript</code>."
], [
"2013-07-08",
"Improved search with fuzzy matching and better results\nFor example, searching <code>jqmka</code> now returns <code>jQuery.makeArray()</code>.",
"DevDocs finally has an icon.",
"<code class=\"_label\">space</code> has replaced <code class=\"_label\">alt + space</code> for scrolling down."
], [
"2013-07-06",
"New <a href=\"/dom/\">DOM</a> and <a href=\"/dom_events/\">DOM Events</a> documentations\nDevDocs now includes almost all reference documents available on the Mozilla Developer Network.\nBig thank you to Mozilla and all the people that contributed to MDN.",
"Implemented URL search: <a href=\"/#q=sort\">devdocs.io/#q=sort</a>"
], [
"2013-07-02",
"New <a href=\"/javascript/\">JavaScript</a> documentation"
], [
"2013-06-28",
"DevDocs made the front page of Hacker News!\nHi everyone — thanks for trying DevDocs.\nPlease bear with me while I fix bugs and scramble to add more docs.\nThis is only v1. There's a lot more to come."
], [
"2013-06-18",
"Initial release"
]
]
================================================
FILE: assets/javascripts/templates/base.js
================================================
app.templates.render = function (name, value, ...args) {
const template = app.templates[name];
if (Array.isArray(value)) {
let result = "";
for (var val of value) {
result += template(val, ...args);
}
return result;
} else if (typeof template === "function") {
return template(value, ...args);
} else {
return template;
}
};
================================================
FILE: assets/javascripts/templates/error_tmpl.js
================================================
const error = function (title, text, links) {
if (text == null) {
text = "";
}
if (links == null) {
links = "";
}
if (text) {
text = `<p class="_error-text">${text}</p>`;
}
if (links) {
links = `<p class="_error-links">${links}</p>`;
}
return `<div class="_error"><h1 class="_error-title">${title}</h1>${text}${links}</div>`;
};
const back = '<a href="#" data-behavior="back" class="_error-link">Go back</a>';
app.templates.notFoundPage = () =>
error(
" Page not found. ",
" It may be missing from the source documentation or this could be a bug. ",
back,
);
app.templates.pageLoadError = () =>
error(
" The page failed to load. ",
` It may be missing from the server (try reloading the app) or you could be offline (try <a href="/offline">installing the documentation for offline usage</a> when online again).<br>
If you're online and you keep seeing this, you're likely behind a proxy or firewall that blocks cross-domain requests. `,
` ${back} · <a href="/#${location.pathname}" target="_top" class="_error-link">Reload</a>
· <a href="#" class="_error-link" data-retry>Retry</a> `,
);
app.templates.bootError = () =>
error(
" The app failed to load. ",
` Check your Internet connection and try <a href="#" data-behavior="reload">reloading</a>.<br>
If you keep seeing this, you're likely behind a proxy or firewall that blocks cross-domain requests. `,
);
app.templates.offlineError = function (reason, exception) {
if (reason === "cookie_blocked") {
return error(" Cookies must be enabled to use offline mode. ");
}
reason = (() => {
switch (reason) {
case "not_supported":
return ` DevDocs requires IndexedDB to cache documentations for offline access.<br>
Unfortunately your browser either doesn't support IndexedDB or doesn't make it available. `;
case "buggy":
return ` DevDocs requires IndexedDB to cache documentations for offline access.<br>
Unfortunately your browser's implementation of IndexedDB contains bugs that prevent DevDocs from using it. `;
case "private_mode":
return ` Your browser appears to be running in private mode.<br>
This prevents DevDocs from caching documentations for offline access.`;
case "exception":
return ` An error occurred when trying to open the IndexedDB database:<br>
<code class="_label">${exception.name}: ${exception.message}</code> `;
case "cant_open":
return ` An error occurred when trying to open the IndexedDB database:<br>
<code class="_label">${exception.name}: ${exception.message}</code><br>
This could be because you're browsing in private mode or have disallowed offline storage on the domain. `;
case "version":
return ` The IndexedDB database was modified with a newer version of the app.<br>
<a href="#" data-behavior="reload">Reload the page</a> to use offline mode. `;
case "empty":
return ' The IndexedDB database appears to be corrupted. Try <a href="#" data-behavior="reset">resetting the app</a>. ';
}
})();
return error("Offline mode is unavailable.", reason);
};
app.templates.unsupportedBrowser = `\
<div class="_fail">
<h1 class="_fail-title">Your browser is unsupported, sorry.</h1>
<p class="_fail-text">DevDocs is an API documentation browser which supports the following browsers:
<ul class="_fail-list">
<li>Recent versions of Firefox, Chrome, or Opera
<li>Safari 11.1+
<li>Edge 17+
<li>iOS 11.3+
</ul>
<p class="_fail-text">
If you're unable to upgrade, we apologize.
We decided to prioritize speed and new features over support for older browsers.
<p class="_fail-text">
Note: if you're already using one of the browsers above, check your settings and add-ons.
The app uses feature detection, not user agent sniffing.
<p class="_fail-text">
— <a href="https://twitter.com/DevDocs">@DevDocs</a>
</div>\
`;
================================================
FILE: assets/javascripts/templates/notice_tmpl.js
================================================
const notice = (text) => `<p class="_notice-text">${text}</p>`;
app.templates.singleDocNotice = (doc) =>
notice(` You're browsing the ${doc.fullName} documentation. To browse all docs, go to
<a href="//${app.config.production_host}" target="_top">${app.config.production_host}</a> (or press <code>esc</code>). `);
app.templates.disabledDocNotice = () =>
notice(` <strong>This documentation is disabled.</strong>
To enable it, go to <a href="/settings" class="_notice-link">Preferences</a>. `);
================================================
FILE: assets/javascripts/templates/notif_tmpl.js
================================================
const notif = function (title, html) {
html = html.replace(/<a /g, '<a class="_notif-link" ');
return ` <h5 class="_notif-title">${title}</h5>
${html}
<button type="button" class="_notif-close" title="Close"><svg><use xlink:href="#icon-close"/></svg>Close</a>\
`;
};
const textNotif = (title, message) =>
notif(title, `<p class="_notif-text">${message}`);
app.templates.notifUpdateReady = () =>
textNotif(
'<span data-behavior="reboot">DevDocs has been updated.</span>',
'<span data-behavior="reboot"><a href="#" data-behavior="reboot">Reload the page</a> to use the new version.</span>',
);
app.templates.notifError = () =>
textNotif(
" Oops, an error occurred. ",
` Try <a href="#" data-behavior="hard-reload">reloading</a>, and if the problem persists,
<a href="#" data-behavior="reset">resetting the app</a>.<br>
You can also report this issue on <a href="https://github.com/freeCodeCamp/devdocs/issues/new" target="_blank" rel="noopener">GitHub</a>. `,
);
app.templates.notifQuotaExceeded = () =>
textNotif(
" The offline database has exceeded its size limitation. ",
" Unfortunately this quota can't be detected programmatically, and the database can't be opened while over the quota, so it had to be reset. ",
);
app.templates.notifCookieBlocked = () =>
textNotif(
" Please enable cookies. ",
" DevDocs will not work properly if cookies are disabled. ",
);
app.templates.notifInvalidLocation = () =>
textNotif(
` DevDocs must be loaded from ${app.config.production_host} `,
" Otherwise things are likely to break. ",
);
app.templates.notifImportInvalid = () =>
textNotif(
" Oops, an error occurred. ",
" The file you selected is invalid. ",
);
app.templates.notifNews = (news) =>
notif(
"Changelog",
`<div class="_notif-content _notif-news">${app.templates.newsList(news, {
years: false,
})}</div>`,
);
app.templates.notifUpdates = function (docs, disabledDocs) {
let doc;
let html = '<div class="_notif-content _notif-news">';
if (docs.length > 0) {
html += '<div class="_news-row">';
html += '<ul class="_notif-list">';
for (doc of docs) {
html += `<li>${doc.name}`;
if (doc.release) {
html += ` <code>→</code> ${doc.release}`;
}
}
html += "</ul></div>";
}
if (disabledDocs.length > 0) {
html += '<div class="_news-row"><p class="_news-title">Disabled:';
html += '<ul class="_notif-list">';
for (doc of disabledDocs) {
html += `<li>${doc.name}`;
if (doc.release) {
html += ` <code>→</code> ${doc.release}`;
}
html += '<span class="_notif-info"><a href="/settings">Enable</a></span>';
}
html += "</ul></div>";
}
return notif("Updates", `${html}</div>`);
};
app.templates.notifShare = () =>
textNotif(
" Hi there! ",
` Like DevDocs? Help us reach more developers by sharing the link with your friends on
<a href="https://out.devdocs.io/s/tw" target="_blank" rel="noopener">Twitter</a>, <a href="https://out.devdocs.io/s/fb" target="_blank" rel="noopener">Facebook</a>,
<a href="https://out.devdocs.io/s/re" target="_blank" rel="noopener">Reddit</a>, etc.<br>Thanks :) `,
);
app.templates.notifUpdateDocs = () =>
textNotif(
" Documentation updates available. ",
' <a href="/offline">Install them</a> as soon as possible to avoid broken pages. ',
);
app.templates.notifAnalyticsConsent = () =>
textNotif(
" Tracking cookies ",
` We would like to gather usage data about how DevDocs is used through Google Analytics and Gauges. We only collect anonymous traffic information.
Please confirm if you accept our tracking cookies. You can always change your decision in the settings.
<br><span class="_notif-right"><a href="#" data-behavior="accept-analytics">Accept</a> or <a href="#" data-behavior="decline-analytics">Decline</a></span> `,
);
================================================
FILE: assets/javascripts/templates/pages/about_tmpl.js
================================================
app.templates.aboutPage = function () {
let doc;
const all_docs = app.docs.all().concat(...(app.disabledDocs.all() || []));
// de-duplicate docs by doc.name
const docs = [];
for (doc of all_docs) {
if (!docs.find((d) => d.name === doc.name)) {
docs.push(doc);
}
}
return `\
<nav class="_toc" role="directory">
<h3 class="_toc-title">Table of Contents</h3>
<ul class="_toc-list">
<li><a href="#copyright">Copyright</a>
<li><a href="#plugins">Plugins</a>
<li><a href="#faq">FAQ</a>
<li><a href="#credits">Credits</a>
<li><a href="#privacy">Privacy Policy</a>
</ul>
</nav>
<h1 class="_lined-heading">DevDocs: API Documentation Browser</h1>
<p>DevDocs combines multiple developer documentations in a clean and organized web UI with instant search, offline support, mobile version, dark theme, keyboard shortcuts, and more.
<p>DevDocs is free and <a href="https://github.com/freeCodeCamp/devdocs">open source</a>. It was created by <a href="https://thibaut.me">Thibaut Courouble</a> and is operated by <a href="https://www.freecodecamp.org/">freeCodeCamp</a>.
<p>To keep up-to-date with the latest news:
<ul>
<li>Follow <a href="https://twitter.com/DevDocs">@DevDocs</a> on Twitter
<li>Watch the repository on <a href="https://github.com/freeCodeCamp/devdocs/subscription">GitHub</a> <iframe class="_github-btn" src="https://ghbtns.com/github-btn.html?user=freeCodeCamp&repo=devdocs&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="100" height="20" tabindex="-1"></iframe>
<li>Join the <a href="https://discord.gg/PRyKn3Vbay">Discord</a> chat room
</ul>
<h2 class="_block-heading" id="copyright">Copyright and License</h2>
<p class="_note">
<strong>Copyright 2013–2026 Thibaut Courouble and <a href="https://github.com/freeCodeCamp/devdocs/graphs/contributors">other contributors</a></strong><br>
This software is licensed under the terms of the Mozilla Public License v2.0.<br>
You may obtain a copy of the source code at <a href="https://github.com/freeCodeCamp/devdocs">github.com/freeCodeCamp/devdocs</a>.<br>
For more information, see the <a href="https://github.com/freeCodeCamp/devdocs/blob/main/COPYRIGHT">COPYRIGHT</a>
and <a href="https://github.com/freeCodeCamp/devdocs/blob/main/LICENSE">LICENSE</a> files.
<h2 class="_block-heading" id="plugins">Plugins and Extensions</h2>
<ul>
<li><a href="https://sublime.wbond.net/packages/DevDocs">Sublime Text package</a>
<li><a href="https://atom.io/packages/devdocs">Atom package</a>
<li><a href="https://marketplace.visualstudio.com/items?itemName=deibit.devdocs">Visual Studio Code extension</a>
<li><a href="https://github.com/yannickglt/alfred-devdocs">Alfred workflow</a>
<li><a href="https://github.com/search?q=topic%3Adevdocs&type=Repositories">More…</a>
</ul>
<h2 class="_block-heading" id="faq">Questions & Answers</h2>
<dl>
<dt>Where can I suggest new docs and features?
<dd>You can suggest and vote for new docs on the <a href="https://trello.com/b/6BmTulfx/devdocs-documentation">Trello board</a>.<br>
If you have a specific feature request, add it to the <a href="https://github.com/freeCodeCamp/devdocs/issues">issue tracker</a>.<br>
Otherwise, come talk to us in the <a href="https://discord.gg/PRyKn3Vbay">Discord</a> chat room.
<dt>Where can I report bugs?
<dd>In the <a href="https://github.com/freeCodeCamp/devdocs/issues">issue tracker</a>. Thanks!
</dl>
<h2 class="_block-heading" id="credits">Credits</h2>
<p><strong>Special thanks to:</strong>
<ul>
<li><a href="https://sentry.io/">Sentry</a> and <a href="https://get.gaug.es/?utm_source=devdocs&utm_medium=referral&utm_campaign=sponsorships" title="Real Time Web Analytics">Gauges</a> for offering a free account to DevDocs
<li><a href="https://out.devdocs.io/s/maxcdn">MaxCDN</a>, <a href="https://out.devdocs.io/s/shopify">Shopify</a>, <a href="https://out.devdocs.io/s/jetbrains">JetBrains</a> and <a href="https://out.devdocs.io/s/code-school">Code School</a> for sponsoring DevDocs in the past
<li><a href="https://www.heroku.com">Heroku</a> and <a href="https://newrelic.com/">New Relic</a> for providing awesome free service
<li><a href="https://www.jeremykratz.com/">Jeremy Kratz</a> for the C/C++ logo
</ul>
<div class="_table">
<table class="_credits">
<tr>
<th>Documentation
<th>Copyright/License
<th>Source code
${docs
.map(
(doc) =>
`<tr><td><a href="${doc.links?.home}">${doc.name}</a></td><td>${doc.attribution}</td><td><a href="${doc.links?.code}">Source code</a></td></tr>`,
)
.join("")}
</table>
</div>
<h2 class="_block-heading" id="privacy">Privacy Policy</h2>
<ul>
<li><a href="https://devdocs.io">devdocs.io</a> ("App") is operated by <a href="https://www.freecodecamp.org/">freeCodeCamp</a> ("We").
<li>We do not collect personal information through the app.
<li>We use Google Analytics and Gauges to collect anonymous traffic information if you have given consent to this. You can change your decision in the <a href="/settings">settings</a>.
<li>We use Sentry to collect crash data and improve the app.
<li>The app uses cookies to store user preferences.
<li>By using the app, you signify your acceptance of this policy. If you do not agree to this policy, please do not use the app.
<li>If you have any questions regarding privacy, please email <a href="mailto:privacy@freecodecamp.org">privacy@freecodecamp.org</a>.
</ul>\
`;
};
================================================
FILE: assets/javascripts/templates/pages/help_tmpl.js
================================================
app.templates.helpPage = function () {
const ctrlKey = $.isMac() ? "cmd" : "ctrl";
const navKey = $.isMac() ? "cmd" : "alt";
const arrowScroll = app.settings.get("arrowScroll");
const aliases = Object.entries(app.config.docs_aliases);
const middle = Math.ceil(aliases.length / 2);
const aliases_one = aliases.slice(0, middle);
const aliases_two = aliases.slice(middle);
return `\
<nav class="_toc" role="directory">
<h3 class="_toc-title">Table of Contents</h3>
<ul class="_toc-list">
<li><a href="#managing-documentations">Managing Documentations</a>
<li><a href="#search">Search</a>
<li><a href="#shortcuts">Keyboard Shortcuts</a>
<li><a href="#aliases">Search Aliases</a>
</ul>
</nav>
<h1 class="_lined-heading">User Guide</h1>
<h2 class="_block-heading" id="managing-documentations">Managing Documentations</h2>
<p>
Documentations can be enabled and disabled in the <a href="/settings">Preferences</a>.
Alternatively, you can enable a documentation by searching for it in the main search
and clicking the "Enable" link in the results.
For faster and better search, only enable the documentations you plan on actively using.
<p>
Once a documentation is enabled, it becomes part of the search and its content can be downloaded for offline access — and faster page loads when online — in the <a href="/offline">Offline</a> area.
<h2 class="_block-heading" id="search">Search</h2>
<p>
The search is case-insensitive and ignores whitespace. It supports fuzzy matching
(e.g. <code class="_label">bgcp</code> matches <code class="_label">background-clip</code>)
as well as aliases (full list <a href="#aliases">below</a>).
<dl>
<dt id="doc_search">Searching a single documentation
<dd>
The search can be scoped to a single documentation by typing its name (or an abbreviation)
and pressing <code class="_label">tab</code> (<code class="_label">space</code> on mobile).
For example, to search the JavaScript documentation, enter <code class="_label">javascript</code>
or <code class="_label">js</code>, then <code class="_label">tab</code>.<br>
To clear the current scope, empty the search field and hit <code class="_label">backspace</code> or
<code class="_label">esc</code>.
<dt id="url_search">Prefilling the search field
<dd>
The search can be prefilled from the URL by visiting <a href="/#q=keyword" target="_top">devdocs.io/#q=keyword</a>.
Characters after <code class="_label">#q=</code> will be used as search query.<br>
To search a single documentation, add its name (or an abbreviation) and a space before the keyword:
<a href="/#q=js%20date" target="_top">devdocs.io/#q=js date</a>.
<dt id="browser_search">Searching using the address bar
<dd>
DevDocs supports OpenSearch. It can easily be installed as a search engine on most web browsers:
<ul>
<li>On Chrome, the setup is done automatically. Simply press <code class="_label">tab</code> when devdocs.io is autocompleted
in the omnibox (to set a custom keyword, click <em>Manage search engines\u2026</em> in Chrome's settings).
<li>On Firefox, <a href="https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox#w_add-a-search-engine-from-the-address-bar">add the search from the address bar</a>:
Click ••• in the address bar, and select <em>Add Search Engine</em>. Then, you can add a keyword for this search engine in the preferences.
</dl>
<p>
<i>Note: the above search features only work for documentations that are enabled.</i>
<h2 class="_block-heading" id="shortcuts">Keyboard Shortcuts</h2>
<h3 class="_shortcuts-title">Sidebar</h3>
<dl class="_shortcuts-dl">
<dt class="_shortcuts-dt">
${arrowScroll ? '<code class="_shortcut-code">shift</code> + ' : ""}
<code class="_shortcut-code">↓</code>
<code class="_shortcut-code">↑</code>
<dd class="_shortcuts-dd">Move selection
<dt class="_shortcuts-dt">
${arrowScroll ? '<code class="_shortcut-code">shift</code> + ' : ""}
<code class="_shortcut-code">→</code>
<code class="_shortcut-code">←</code>
<dd class="_shortcuts-dd">Show/hide sub-list
<dt class="_shortcuts-dt">
<code class="_shortcut-code">enter</code>
<dd class="_shortcuts-dd">Open selection
<dt class="_shortcuts-dt">
<code class="_shortcut-code">${ctrlKey} + enter</code>
<dd class="_shortcuts-dd">Open selection in a new tab
<dt class="_shortcuts-dt">
<code class="_shortcut-code">alt + r</code>
<dd class="_shortcuts-dd">Reveal current page in sidebar
</dl>
<h3 class="_shortcuts-title">Browsing</h3>
<dl class="_shortcuts-dl">
<dt class="_shortcuts-dt">
<code class="_shortcut-code">${navKey} + ←</code>
<code class="_shortcut-code">${navKey} + →</code>
<dd class="_shortcuts-dd">Go back/forward
<dt class="_shortcuts-dt">
${
arrowScroll
? '<code class="_shortcut-code">↓</code> ' +
'<code class="_shortcut-code">↑</code>'
: '<code class="_shortcut-code">alt + ↓</code> ' +
'<code class="_shortcut-code">alt + ↑</code>' +
"<br>" +
'<code class="_shortcut-code">shift + ↓</code> ' +
'<code class="_shortcut-code">shift + ↑</code>'
}
<dd class="_shortcuts-dd">Scroll step by step<br><br>
<dt class="_shortcuts-dt">
<code class="_shortcut-code">space</code>
<code class="_shortcut-code">shift + space</code>
<dd class="_shortcuts-dd">Scroll screen by screen
<dt class="_shortcuts-dt">
<code class="_shortcut-code">${ctrlKey} + ↑</code>
<code class="_shortcut-code">${ctrlKey} + ↓</code>
<dd class="_shortcuts-dd">Scroll to the top/bottom
<dt class="_shortcuts-dt">
<code class="_shortcut-code">alt + f</code>
<dd class="_shortcuts-dd">Focus first link in the content area<br>(press tab to focus the other links)
</dl>
<h3 class="_shortcuts-title">App</h3>
<dl class="_shortcuts-dl">
<dt class="_shortcuts-dt">
<code class="_shortcut-code">ctrl + ,</code>
<dd class="_shortcuts-dd">Open preferences
<dt class="_s
gitextract_4et9rv65/
├── .dockerignore
├── .editorconfig
├── .github/
│ ├── CODEOWNERS
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ ├── documentation_bug.md
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── no-response.yml
│ └── workflows/
│ ├── build.yml
│ ├── docker-build.yml
│ ├── schedule-doc-report.yml
│ └── test.yml
├── .gitignore
├── .image_optim.yml
├── .ruby-version
├── .slugignore
├── .tool-versions
├── COPYRIGHT
├── Dockerfile
├── Dockerfile-alpine
├── Gemfile
├── LICENSE
├── Procfile
├── README.md
├── Rakefile
├── Thorfile
├── assets/
│ ├── images/
│ │ └── .gitignore
│ ├── javascripts/
│ │ ├── app/
│ │ │ ├── app.js
│ │ │ ├── config.js.erb
│ │ │ ├── db.js
│ │ │ ├── router.js
│ │ │ ├── searcher.js
│ │ │ ├── serviceworker.js
│ │ │ ├── settings.js
│ │ │ ├── shortcuts.js
│ │ │ └── update_checker.js
│ │ ├── application.js
│ │ ├── collections/
│ │ │ ├── collection.js
│ │ │ ├── docs.js
│ │ │ ├── entries.js
│ │ │ └── types.js
│ │ ├── debug.js
│ │ ├── docs.js.erb
│ │ ├── lib/
│ │ │ ├── ajax.js
│ │ │ ├── cookies_store.js
│ │ │ ├── events.js
│ │ │ ├── favicon.js
│ │ │ ├── license.js
│ │ │ ├── local_storage_store.js
│ │ │ ├── page.js
│ │ │ └── util.js
│ │ ├── models/
│ │ │ ├── doc.js
│ │ │ ├── entry.js
│ │ │ ├── model.js
│ │ │ └── type.js
│ │ ├── news.json
│ │ ├── templates/
│ │ │ ├── base.js
│ │ │ ├── error_tmpl.js
│ │ │ ├── notice_tmpl.js
│ │ │ ├── notif_tmpl.js
│ │ │ ├── pages/
│ │ │ │ ├── about_tmpl.js
│ │ │ │ ├── help_tmpl.js
│ │ │ │ ├── news_tmpl.js.erb
│ │ │ │ ├── offline_tmpl.js
│ │ │ │ ├── root_tmpl.js.erb
│ │ │ │ ├── settings_tmpl.js
│ │ │ │ └── type_tmpl.js
│ │ │ ├── path_tmpl.js
│ │ │ ├── sidebar_tmpl.js
│ │ │ └── tip_tmpl.js
│ │ ├── tracking.js
│ │ ├── vendor/
│ │ │ ├── cookies.js
│ │ │ ├── mathml.js
│ │ │ ├── prism.js
│ │ │ └── raven.js
│ │ └── views/
│ │ ├── content/
│ │ │ ├── content.js
│ │ │ ├── entry_page.js
│ │ │ ├── offline_page.js
│ │ │ ├── root_page.js
│ │ │ ├── settings_page.js
│ │ │ ├── static_page.js
│ │ │ └── type_page.js
│ │ ├── layout/
│ │ │ ├── document.js
│ │ │ ├── menu.js
│ │ │ ├── mobile.js
│ │ │ ├── path.js
│ │ │ ├── resizer.js
│ │ │ └── settings.js
│ │ ├── list/
│ │ │ ├── list_focus.js
│ │ │ ├── list_fold.js
│ │ │ ├── list_select.js
│ │ │ └── paginated_list.js
│ │ ├── misc/
│ │ │ ├── news.js
│ │ │ ├── notice.js
│ │ │ ├── notif.js
│ │ │ ├── tip.js
│ │ │ └── updates.js
│ │ ├── pages/
│ │ │ ├── base.js
│ │ │ ├── hidden.js
│ │ │ ├── jquery.js
│ │ │ ├── rdoc.js
│ │ │ ├── sqlite.js
│ │ │ └── support_tables.js
│ │ ├── search/
│ │ │ ├── search.js
│ │ │ └── search_scope.js
│ │ ├── sidebar/
│ │ │ ├── doc_list.js
│ │ │ ├── doc_picker.js
│ │ │ ├── entry_list.js
│ │ │ ├── results.js
│ │ │ ├── sidebar.js
│ │ │ ├── sidebar_hover.js
│ │ │ └── type_list.js
│ │ └── view.js
│ └── stylesheets/
│ ├── application.css.scss
│ ├── components/
│ │ ├── _app.scss
│ │ ├── _content.scss
│ │ ├── _environment.scss.erb
│ │ ├── _fail.scss
│ │ ├── _header.scss
│ │ ├── _mobile.scss
│ │ ├── _notice.scss
│ │ ├── _notif.scss
│ │ ├── _page.scss
│ │ ├── _path.scss
│ │ ├── _prism.scss
│ │ ├── _settings.scss
│ │ └── _sidebar.scss
│ ├── global/
│ │ ├── _base.scss
│ │ ├── _classes.scss
│ │ ├── _icons.scss.erb
│ │ ├── _mixins.scss
│ │ ├── _print.scss
│ │ ├── _variables-dark.scss
│ │ ├── _variables-light.scss
│ │ └── _variables.scss
│ └── pages/
│ ├── _angular.scss
│ ├── _angularjs.scss
│ ├── _apache.scss
│ ├── _async.scss
│ ├── _bash.scss
│ ├── _bootstrap.scss
│ ├── _cakephp.scss
│ ├── _chef.scss
│ ├── _clojure.scss
│ ├── _codeception.scss
│ ├── _coffeescript.scss
│ ├── _cordova.scss
│ ├── _cppref.scss
│ ├── _crystal.scss
│ ├── _cypress.scss
│ ├── _d.scss
│ ├── _d3.scss
│ ├── _dart.scss
│ ├── _dojo.scss
│ ├── _drupal.scss
│ ├── _eigen3.scss
│ ├── _elisp.scss
│ ├── _elixir.scss
│ ├── _ember.scss
│ ├── _erlang.scss
│ ├── _express.scss
│ ├── _fastapi.scss
│ ├── _fluture.scss
│ ├── _git.scss
│ ├── _github.scss
│ ├── _gnu_make.scss
│ ├── _gnuplot.scss
│ ├── _go.scss
│ ├── _graphite.scss
│ ├── _groovy.scss
│ ├── _gtk.scss
│ ├── _hapi.scss
│ ├── _haproxy.scss
│ ├── _haskell.scss
│ ├── _jasmine.scss
│ ├── _jekyll.scss
│ ├── _joi.scss
│ ├── _jq.scss
│ ├── _jquery.scss
│ ├── _julia.scss
│ ├── _knockout.scss
│ ├── _kotlin.scss
│ ├── _kubectl.scss
│ ├── _kubernetes.scss
│ ├── _laravel.scss
│ ├── _liquid.scss
│ ├── _lit.scss
│ ├── _love.scss
│ ├── _lua.scss
│ ├── _mariadb.scss
│ ├── _mdn.scss
│ ├── _meteor.scss
│ ├── _mkdocs.scss
│ ├── _modernizr.scss
│ ├── _moment.scss
│ ├── _nginx.scss
│ ├── _node.scss
│ ├── _npm.scss
│ ├── _nushell.scss
│ ├── _octave.scss
│ ├── _openjdk.scss
│ ├── _openlayers.scss
│ ├── _perl.scss
│ ├── _phalcon.scss
│ ├── _phaser.scss
│ ├── _php.scss
│ ├── _phpunit.scss
│ ├── _postgres.scss
│ ├── _pug.scss
│ ├── _pygame.scss
│ ├── _python.scss
│ ├── _qt.scss
│ ├── _ramda.scss
│ ├── _rdoc.scss
│ ├── _react.scss
│ ├── _react_native.scss
│ ├── _reactivex.scss
│ ├── _redis.scss
│ ├── _rethinkdb.scss
│ ├── _rfc.scss
│ ├── _rubydoc.scss
│ ├── _rust.scss
│ ├── _rxjs.scss
│ ├── _sanctuary.scss
│ ├── _sanctuary_def.scss
│ ├── _sanctuary_type_classes.scss
│ ├── _scala.scss
│ ├── _simple.scss
│ ├── _sinon.scss
│ ├── _sphinx.scss
│ ├── _sphinx_simple.scss
│ ├── _sqlite.scss
│ ├── _support_tables.scss
│ ├── _tailwindcss.scss
│ ├── _tcl_tk.scss
│ ├── _tensorflow.scss
│ ├── _terraform.scss
│ ├── _typescript.scss
│ ├── _underscore.scss
│ ├── _vue.scss
│ ├── _webpack.scss
│ ├── _wordpress.scss
│ ├── _yard.scss
│ └── _yii.scss
├── config.ru
├── docs/
│ ├── adding-docs.md
│ ├── file-scrapers.md
│ ├── filter-reference.md
│ ├── maintainers.md
│ └── scraper-reference.md
├── lib/
│ ├── app.rb
│ ├── docs/
│ │ ├── core/
│ │ │ ├── autoload_helper.rb
│ │ │ ├── doc.rb
│ │ │ ├── entry_index.rb
│ │ │ ├── filter.rb
│ │ │ ├── filter_stack.rb
│ │ │ ├── instrumentable.rb
│ │ │ ├── manifest.rb
│ │ │ ├── models/
│ │ │ │ ├── entry.rb
│ │ │ │ └── type.rb
│ │ │ ├── page_db.rb
│ │ │ ├── parser.rb
│ │ │ ├── request.rb
│ │ │ ├── requester.rb
│ │ │ ├── response.rb
│ │ │ ├── scraper.rb
│ │ │ ├── scrapers/
│ │ │ │ ├── file_scraper.rb
│ │ │ │ └── url_scraper.rb
│ │ │ ├── subscriber.rb
│ │ │ └── url.rb
│ │ ├── filters/
│ │ │ ├── angular/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_v18.rb
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_v2.rb
│ │ │ ├── angularjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_urls.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ansible/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── apache/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── apache_pig/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── astro/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── async/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── axios/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── babel/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── backbone/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bash/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bazel/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bluebird/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bootstrap/
│ │ │ │ ├── clean_html_v3.rb
│ │ │ │ ├── clean_html_v4.rb
│ │ │ │ ├── clean_html_v5.rb
│ │ │ │ ├── entries_v3.rb
│ │ │ │ ├── entries_v4.rb
│ │ │ │ └── entries_v5.rb
│ │ │ ├── bottle/
│ │ │ │ └── entries.rb
│ │ │ ├── bower/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── bun/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── c/
│ │ │ │ └── entries.rb
│ │ │ ├── cakephp/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_39_plus.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_39_plus.rb
│ │ │ ├── chai/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── chef/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── chefclient/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── click/
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── clojure/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cmake/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── codeception/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── codeceptjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── codeigniter/
│ │ │ │ └── entries.rb
│ │ │ ├── coffeescript/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_v1.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_v1.rb
│ │ │ ├── composer/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cordova/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_core.rb
│ │ │ │ └── entries.rb
│ │ │ ├── core/
│ │ │ │ ├── apply_base_url.rb
│ │ │ │ ├── attribution.rb
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_local_urls.rb
│ │ │ │ ├── clean_text.rb
│ │ │ │ ├── container.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── images.rb
│ │ │ │ ├── inner_html.rb
│ │ │ │ ├── internal_urls.rb
│ │ │ │ ├── normalize_paths.rb
│ │ │ │ ├── normalize_urls.rb
│ │ │ │ ├── parse_cf_email.rb
│ │ │ │ └── title.rb
│ │ │ ├── couchdb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cpp/
│ │ │ │ └── entries.rb
│ │ │ ├── cppref/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── fix_code.rb
│ │ │ ├── crystal/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── css/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── cypress/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── d/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── d3/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries_v3.rb
│ │ │ │ └── entries_v4.rb
│ │ │ ├── dart/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── deno/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── django/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── fix_urls.rb
│ │ │ ├── django_rest_framework/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── docker/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── dojo/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_urls.rb
│ │ │ │ └── entries.rb
│ │ │ ├── dom/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── drupal/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── internal_urls.rb
│ │ │ │ └── normalize_paths.rb
│ │ │ ├── duckdb/
│ │ │ │ ├── attribution.rb
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── eigen3/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── electron/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── elisp/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── elixir/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ember/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── enzyme/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── erlang/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── esbuild/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── eslint/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── express/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── falcon/
│ │ │ │ └── entries.rb
│ │ │ ├── fastapi/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── container.rb
│ │ │ │ └── entries.rb
│ │ │ ├── fish/
│ │ │ │ ├── clean_html_custom.rb
│ │ │ │ ├── clean_html_sphinx.rb
│ │ │ │ ├── entries_custom.rb
│ │ │ │ └── entries_sphinx.rb
│ │ │ ├── flask/
│ │ │ │ └── entries.rb
│ │ │ ├── flow/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── fluture/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gcc/
│ │ │ │ └── clean_html.rb
│ │ │ ├── git/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── github/
│ │ │ │ └── clean_html.rb
│ │ │ ├── gnu/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gnu_cobol/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gnu_make/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gnuplot/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── go/
│ │ │ │ ├── attribution.rb
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── godot/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── clean_html_v3.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── graphite/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── graphviz/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── groovy/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── grunt/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── gtk/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── hammerspoon/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── handlebars/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── hapi/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── haproxy/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── haskell/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── haxe/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── homebrew/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── html/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── htmx/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── http/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── i3/
│ │ │ │ └── entries.rb
│ │ │ ├── immutable/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── influxdata/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jasmine/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── javascript/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jekyll/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jest/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jinja/
│ │ │ │ └── entries.rb
│ │ │ ├── joi/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jq/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── jquery/
│ │ │ │ └── clean_html.rb
│ │ │ ├── jquery_core/
│ │ │ │ └── entries.rb
│ │ │ ├── jquery_mobile/
│ │ │ │ └── entries.rb
│ │ │ ├── jquery_ui/
│ │ │ │ └── entries.rb
│ │ │ ├── jsdoc/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── julia/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_sphinx.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_sphinx.rb
│ │ │ ├── knockout/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── koa/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── kotlin/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── kubectl/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── kubernetes/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── laravel/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── latex/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── leaflet/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── less/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── liquid/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── lit/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── lodash/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── love/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── lua/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── man/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── mariadb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── erase_invalid_pages.rb
│ │ │ ├── marionette/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── markdown/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── matplotlib/
│ │ │ │ └── entries.rb
│ │ │ ├── mdn/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── compat_tables.rb
│ │ │ ├── meteor/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── minitest/
│ │ │ │ └── entries.rb
│ │ │ ├── mkdocs/
│ │ │ │ └── clean_html.rb
│ │ │ ├── mocha/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── modernizr/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── moment/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── moment_timezone/
│ │ │ │ └── entries.rb
│ │ │ ├── mongoose/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nextjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nginx/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nginx_lua_module/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nim/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nix/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── node/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── old_entries.rb
│ │ │ ├── nokogiri2/
│ │ │ │ └── entries.rb
│ │ │ ├── npm/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── numpy/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── nushell/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── fix_links.rb
│ │ │ ├── ocaml/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── octave/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── opengl/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── openjdk/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_new.rb
│ │ │ │ ├── clean_urls.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_new.rb
│ │ │ ├── openlayers/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── opentsdb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── padrino/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pandas/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── perl/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── phalcon/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── phaser/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── php/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── fix_urls.rb
│ │ │ │ └── internal_urls.rb
│ │ │ ├── phpunit/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── playwright/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── point_cloud_library/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pony/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── postgresql/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ ├── extract_metadata.rb
│ │ │ │ └── normalize_class_names.rb
│ │ │ ├── prettier/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pug/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── puppeteer/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── pygame/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── pre_clean_html.rb
│ │ │ ├── python/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── pytorch/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── q/
│ │ │ │ └── entries.rb
│ │ │ ├── qt/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── qunit/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── r/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rails/
│ │ │ │ ├── clean_html_guides.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ramda/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rdoc/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── container.rb
│ │ │ │ └── entries.rb
│ │ │ ├── react/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_react_dev.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_react_dev.rb
│ │ │ ├── react_bootstrap/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── react_native/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── react_router/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── reactivex/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── redis/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── redux/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── relay/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── requests/
│ │ │ │ └── entries.rb
│ │ │ ├── requirejs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rethinkdb/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── ruby/
│ │ │ │ └── entries.rb
│ │ │ ├── rust/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── rxjs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── salt_stack/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sanctuary/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sanctuary_def/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sanctuary_type_classes/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sass/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── scala/
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── clean_html_v3.rb
│ │ │ │ ├── entries_v2.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── scikit_image/
│ │ │ │ └── entries.rb
│ │ │ ├── scikit_learn/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sequelize/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sinon/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── socketio/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sphinx/
│ │ │ │ └── clean_html.rb
│ │ │ ├── spring_boot/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── sqlite/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_js_tables.rb
│ │ │ │ └── entries.rb
│ │ │ ├── statsmodels/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── svelte/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── svg/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── symfony/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── tailwindcss/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── noop.rb
│ │ │ ├── tcl_tk/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── tcllib/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── nop.rb
│ │ │ ├── tensorflow/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── terraform/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── threejs/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── trio/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── twig/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── typescript/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── underscore/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vagrant/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── varnish/
│ │ │ │ └── entries.rb
│ │ │ ├── vertx/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vite/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vitest/
│ │ │ │ └── entries.rb
│ │ │ ├── vue/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_v3.rb
│ │ │ ├── vue_router/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vueuse/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vuex/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── vulkan/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── wagtail/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── web_extensions/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── webpack/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_old.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_old.rb
│ │ │ ├── werkzeug/
│ │ │ │ └── entries.rb
│ │ │ ├── wordpress/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── xslt_xpath/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ ├── yarn/
│ │ │ │ ├── clean_html.rb
│ │ │ │ ├── clean_html_berry.rb
│ │ │ │ ├── entries.rb
│ │ │ │ └── entries_berry.rb
│ │ │ ├── yii/
│ │ │ │ ├── clean_html_v1.rb
│ │ │ │ ├── clean_html_v2.rb
│ │ │ │ ├── entries_v1.rb
│ │ │ │ └── entries_v2.rb
│ │ │ ├── zig/
│ │ │ │ ├── clean_html.rb
│ │ │ │ └── entries.rb
│ │ │ └── zsh/
│ │ │ ├── clean_html.rb
│ │ │ └── entries.rb
│ │ ├── scrapers/
│ │ │ ├── angular.rb
│ │ │ ├── angularjs.rb
│ │ │ ├── ansible.rb
│ │ │ ├── apache.rb
│ │ │ ├── apache_pig.rb
│ │ │ ├── astro.rb
│ │ │ ├── async.rb
│ │ │ ├── axios.rb
│ │ │ ├── babel.rb
│ │ │ ├── backbone.rb
│ │ │ ├── bash.rb
│ │ │ ├── bazel.rb
│ │ │ ├── bluebird.rb
│ │ │ ├── bootstrap.rb
│ │ │ ├── bottle.rb
│ │ │ ├── bower.rb
│ │ │ ├── bun.rb
│ │ │ ├── cakephp.rb
│ │ │ ├── chai.rb
│ │ │ ├── chef.rb
│ │ │ ├── click.rb
│ │ │ ├── clojure.rb
│ │ │ ├── cmake.rb
│ │ │ ├── codeception.rb
│ │ │ ├── codeceptjs.rb
│ │ │ ├── codeigniter.rb
│ │ │ ├── coffeescript.rb
│ │ │ ├── composer.rb
│ │ │ ├── cordova.rb
│ │ │ ├── couchdb.rb
│ │ │ ├── cppref/
│ │ │ │ ├── c.rb
│ │ │ │ ├── cpp.rb
│ │ │ │ └── cppref.rb
│ │ │ ├── crystal.rb
│ │ │ ├── cypress.rb
│ │ │ ├── d.rb
│ │ │ ├── d3.rb
│ │ │ ├── dart.rb
│ │ │ ├── date_fns.rb
│ │ │ ├── deno.rb
│ │ │ ├── django.rb
│ │ │ ├── docker.rb
│ │ │ ├── dojo.rb
│ │ │ ├── drupal.rb
│ │ │ ├── duckdb.rb
│ │ │ ├── eigen3.rb
│ │ │ ├── electron.rb
│ │ │ ├── elisp.rb
│ │ │ ├── elixir.rb
│ │ │ ├── ember.rb
│ │ │ ├── enzyme.rb
│ │ │ ├── erlang.rb
│ │ │ ├── es_toolkit.rb
│ │ │ ├── esbuild.rb
│ │ │ ├── eslint.rb
│ │ │ ├── express.rb
│ │ │ ├── falcon.rb
│ │ │ ├── fastapi.rb
│ │ │ ├── fish.rb
│ │ │ ├── flask.rb
│ │ │ ├── flow.rb
│ │ │ ├── fluture.rb
│ │ │ ├── git.rb
│ │ │ ├── github.rb
│ │ │ ├── gnu/
│ │ │ │ ├── gcc.rb
│ │ │ │ └── gnu_fortran.rb
│ │ │ ├── gnu.rb
│ │ │ ├── gnu_cobol.rb
│ │ │ ├── gnu_make.rb
│ │ │ ├── gnuplot.rb
│ │ │ ├── go.rb
│ │ │ ├── godot.rb
│ │ │ ├── graphite.rb
│ │ │ ├── graphviz.rb
│ │ │ ├── groovy.rb
│ │ │ ├── grunt.rb
│ │ │ ├── gtk.rb
│ │ │ ├── hammerspoon.rb
│ │ │ ├── handlebars.rb
│ │ │ ├── hapi.rb
│ │ │ ├── haproxy.rb
│ │ │ ├── haskell.rb
│ │ │ ├── haxe.rb
│ │ │ ├── homebrew.rb
│ │ │ ├── htmx.rb
│ │ │ ├── http.rb
│ │ │ ├── i3.rb
│ │ │ ├── immutable.rb
│ │ │ ├── influxdata.rb
│ │ │ ├── jasmine.rb
│ │ │ ├── jekyll.rb
│ │ │ ├── jest.rb
│ │ │ ├── jinja.rb
│ │ │ ├── joi.rb
│ │ │ ├── jq.rb
│ │ │ ├── jquery/
│ │ │ │ ├── jquery.rb
│ │ │ │ ├── jquery_core.rb
│ │ │ │ ├── jquery_mobile.rb
│ │ │ │ └── jquery_ui.rb
│ │ │ ├── jsdoc.rb
│ │ │ ├── julia.rb
│ │ │ ├── knockout.rb
│ │ │ ├── koa.rb
│ │ │ ├── kotlin.rb
│ │ │ ├── kubectl.rb
│ │ │ ├── kubernetes.rb
│ │ │ ├── laravel.rb
│ │ │ ├── latex.rb
│ │ │ ├── leaflet.rb
│ │ │ ├── less.rb
│ │ │ ├── liquid.rb
│ │ │ ├── lit.rb
│ │ │ ├── lodash.rb
│ │ │ ├── love.rb
│ │ │ ├── lua.rb
│ │ │ ├── man.rb
│ │ │ ├── mariadb.rb
│ │ │ ├── marionette.rb
│ │ │ ├── markdown.rb
│ │ │ ├── matplotlib.rb
│ │ │ ├── mdn/
│ │ │ │ ├── css.rb
│ │ │ │ ├── dom.rb
│ │ │ │ ├── html.rb
│ │ │ │ ├── javascript.rb
│ │ │ │ ├── mdn.rb
│ │ │ │ ├── svg.rb
│ │ │ │ ├── web_extensions.rb
│ │ │ │ └── xslt_xpath.rb
│ │ │ ├── meteor.rb
│ │ │ ├── mkdocs/
│ │ │ │ ├── django_rest_framework.rb
│ │ │ │ └── mkdocs.rb
│ │ │ ├── mocha.rb
│ │ │ ├── modernizr.rb
│ │ │ ├── moment.rb
│ │ │ ├── moment_timezone.rb
│ │ │ ├── mongoose.rb
│ │ │ ├── nextjs.rb
│ │ │ ├── nginx.rb
│ │ │ ├── nginx_lua_module.rb
│ │ │ ├── nim.rb
│ │ │ ├── nix.rb
│ │ │ ├── node.rb
│ │ │ ├── nokogiri2.rb
│ │ │ ├── npm.rb
│ │ │ ├── numpy.rb
│ │ │ ├── nushell.rb
│ │ │ ├── ocaml.rb
│ │ │ ├── octave.rb
│ │ │ ├── opengl.rb
│ │ │ ├── openjdk.rb
│ │ │ ├── openlayers.rb
│ │ │ ├── opentsdb.rb
│ │ │ ├── padrino.rb
│ │ │ ├── pandas.rb
│ │ │ ├── perl.rb
│ │ │ ├── phalcon.rb
│ │ │ ├── phaser.rb
│ │ │ ├── phoenix.rb
│ │ │ ├── php.rb
│ │ │ ├── phpunit.rb
│ │ │ ├── playwright.rb
│ │ │ ├── point_cloud_library.rb
│ │ │ ├── pony.rb
│ │ │ ├── postgresql.rb
│ │ │ ├── prettier.rb
│ │ │ ├── pug.rb
│ │ │ ├── puppeteer.rb
│ │ │ ├── pygame.rb
│ │ │ ├── python.rb
│ │ │ ├── pytorch.rb
│ │ │ ├── q.rb
│ │ │ ├── qt.rb
│ │ │ ├── qunit.rb
│ │ │ ├── r.rb
│ │ │ ├── ramda.rb
│ │ │ ├── rdoc/
│ │ │ │ ├── minitest.rb
│ │ │ │ ├── rails.rb
│ │ │ │ ├── rdoc.rb
│ │ │ │ └── ruby.rb
│ │ │ ├── react.rb
│ │ │ ├── react_bootstrap.rb
│ │ │ ├── react_native.rb
│ │ │ ├── react_router.rb
│ │ │ ├── reactivex.rb
│ │ │ ├── redis.rb
│ │ │ ├── redux.rb
│ │ │ ├── relay.rb
│ │ │ ├── requests.rb
│ │ │ ├── requirejs.rb
│ │ │ ├── rethinkdb.rb
│ │ │ ├── rust.rb
│ │ │ ├── rxjs.rb
│ │ │ ├── salt_stack.rb
│ │ │ ├── sanctuary.rb
│ │ │ ├── sanctuary_def.rb
│ │ │ ├── sanctuary_type_classes.rb
│ │ │ ├── sass.rb
│ │ │ ├── scala.rb
│ │ │ ├── scikit_image.rb
│ │ │ ├── scikit_learn.rb
│ │ │ ├── sequelize.rb
│ │ │ ├── sinon.rb
│ │ │ ├── socketio.rb
│ │ │ ├── sphinx.rb
│ │ │ ├── spring_boot.rb
│ │ │ ├── sqlite.rb
│ │ │ ├── statsmodels.rb
│ │ │ ├── support_tables.rb
│ │ │ ├── svelte.rb
│ │ │ ├── symfony.rb
│ │ │ ├── tailwindcss.rb
│ │ │ ├── tcl_tk.rb
│ │ │ ├── tcllib.rb
│ │ │ ├── tensorflow/
│ │ │ │ ├── tensorflow.rb
│ │ │ │ └── tensorflow_cpp.rb
│ │ │ ├── terraform.rb
│ │ │ ├── threejs.rb
│ │ │ ├── trio.rb
│ │ │ ├── twig.rb
│ │ │ ├── typescript.rb
│ │ │ ├── underscore.rb
│ │ │ ├── vagrant.rb
│ │ │ ├── varnish.rb
│ │ │ ├── vertx.rb
│ │ │ ├── vite.rb
│ │ │ ├── vitest.rb
│ │ │ ├── vue.rb
│ │ │ ├── vue_router.rb
│ │ │ ├── vueuse.rb
│ │ │ ├── vuex.rb
│ │ │ ├── vulkan.rb
│ │ │ ├── wagtail.rb
│ │ │ ├── webpack.rb
│ │ │ ├── werkzeug.rb
│ │ │ ├── wordpress.rb
│ │ │ ├── yarn.rb
│ │ │ ├── yii.rb
│ │ │ ├── zig.rb
│ │ │ └── zsh.rb
│ │ ├── storage/
│ │ │ ├── abstract_store.rb
│ │ │ ├── file_store.rb
│ │ │ └── null_store.rb
│ │ └── subscribers/
│ │ ├── doc_subscriber.rb
│ │ ├── filter_subscriber.rb
│ │ ├── image_subscriber.rb
│ │ ├── progress_bar_subscriber.rb
│ │ ├── request_subscriber.rb
│ │ ├── requester_subscriber.rb
│ │ ├── scraper_subscriber.rb
│ │ └── store_subscriber.rb
│ ├── docs.rb
│ └── tasks/
│ ├── assets.thor
│ ├── console.thor
│ ├── docs.thor
│ ├── sprites.thor
│ ├── test.thor
│ └── updates.thor
├── newrelic.yml
├── public/
│ ├── 404.html
│ ├── 500.html
│ ├── favicon.pxm
│ ├── favicon@2x.pxm
│ ├── icons/
│ │ └── docs/
│ │ ├── angular/
│ │ │ └── SOURCE
│ │ ├── angularjs/
│ │ │ └── SOURCE
│ │ ├── ansible/
│ │ │ └── SOURCE
│ │ ├── apache_http_server/
│ │ │ └── SOURCE
│ │ ├── astro/
│ │ │ └── SOURCE
│ │ ├── async/
│ │ │ └── SOURCE
│ │ ├── axios/
│ │ │ └── SOURCE
│ │ ├── babel/
│ │ │ └── SOURCE
│ │ ├── backbone/
│ │ │ └── SOURCE
│ │ ├── bash/
│ │ │ └── SOURCE
│ │ ├── bazel/
│ │ │ └── SOURCE
│ │ ├── bluebird/
│ │ │ └── SOURCE
│ │ ├── bootstrap/
│ │ │ └── SOURCE
│ │ ├── bottle/
│ │ │ └── SOURCE
│ │ ├── bower/
│ │ │ └── SOURCE
│ │ ├── bun/
│ │ │ └── SOURCE
│ │ ├── c/
│ │ │ └── SOURCE
│ │ ├── cakephp/
│ │ │ └── SOURCE
│ │ ├── chai/
│ │ │ └── SOURCE
│ │ ├── chef/
│ │ │ └── SOURCE
│ │ ├── click/
│ │ │ └── SOURCE
│ │ ├── clojure/
│ │ │ └── SOURCE
│ │ ├── cmake/
│ │ │ └── SOURCE
│ │ ├── codeception/
│ │ │ └── SOURCE
│ │ ├── codeceptjs/
│ │ │ └── SOURCE
│ │ ├── codeigniter/
│ │ │ └── SOURCE
│ │ ├── coffeescript/
│ │ │ └── SOURCE
│ │ ├── composer/
│ │ │ └── SOURCE
│ │ ├── cordova/
│ │ │ └── SOURCE
│ │ ├── couchdb/
│ │ │ └── SOURCE
│ │ ├── cpp/
│ │ │ └── SOURCE
│ │ ├── crystal/
│ │ │ └── SOURCE
│ │ ├── css/
│ │ │ └── SOURCE
│ │ ├── cypress/
│ │ │ └── SOURCE
│ │ ├── d/
│ │ │ └── SOURCE
│ │ ├── d3/
│ │ │ └── SOURCE
│ │ ├── dart/
│ │ │ └── SOURCE
│ │ ├── date_fns/
│ │ │ └── SOURCE
│ │ ├── deno/
│ │ │ └── SOURCE
│ │ ├── django/
│ │ │ └── SOURCE
│ │ ├── django_rest_framework/
│ │ │ └── SOURCE
│ │ ├── docker/
│ │ │ └── SOURCE
│ │ ├── dom/
│ │ │ └── DOM.sketch/
│ │ │ ├── Data
│ │ │ ├── fonts
│ │ │ └── version
│ │ ├── dom_events/
│ │ │ └── DOM_events.sketch/
│ │ │ ├── Data
│ │ │ ├── fonts
│ │ │ └── version
│ │ ├── drupal/
│ │ │ └── SOURCE
│ │ ├── duckdb/
│ │ │ └── SOURCE
│ │ ├── eigen3/
│ │ │ └── SOURCE
│ │ ├── electron/
│ │ │ └── SOURCE
│ │ ├── elisp/
│ │ │ └── SOURCE
│ │ ├── elixir/
│ │ │ └── SOURCE
│ │ ├── ember/
│ │ │ └── SOURCE
│ │ ├── erlang/
│ │ │ └── SOURCE
│ │ ├── es_toolkit/
│ │ │ └── SOURCE
│ │ ├── esbuild/
│ │ │ └── SOURCE
│ │ ├── eslint/
│ │ │ └── SOURCE
│ │ ├── express/
│ │ │ ├── 16.pxm
│ │ │ └── 16@2x.pxm
│ │ ├── falcon/
│ │ │ └── SOURCE
│ │ ├── fastapi/
│ │ │ └── SOURCE
│ │ ├── fish/
│ │ │ └── SOURCE
│ │ ├── flask/
│ │ │ └── SOURCE
│ │ ├── flow/
│ │ │ └── SOURCE
│ │ ├── fluture/
│ │ │ └── SOURCE
│ │ ├── git/
│ │ │ └── SOURCE
│ │ ├── gnu_cobol/
│ │ │ └── SOURCE
│ │ ├── gnu_fortran/
│ │ │ └── SOURCE
│ │ ├── gnu_make/
│ │ │ └── SOURCE
│ │ ├── gnuplot/
│ │ │ └── SOURCE
│ │ ├── go/
│ │ │ └── SOURCE
│ │ ├── godot/
│ │ │ └── SOURCE
│ │ ├── graphviz/
│ │ │ └── SOURCE
│ │ ├── groovy/
│ │ │ └── SOURCE
│ │ ├── grunt/
│ │ │ └── SOURCE
│ │ ├── gtk/
│ │ │ └── SOURCE
│ │ ├── hammerspoon/
│ │ │ └── SOURCE
│ │ ├── handlebars/
│ │ │ └── SOURCE
│ │ ├── hapi/
│ │ │ └── SOURCE
│ │ ├── haproxy/
│ │ │ └── SOURCE
│ │ ├── haskell/
│ │ │ └── SOURCE
│ │ ├── haxe/
│ │ │ └── SOURCE
│ │ ├── homebrew/
│ │ │ └── SOURCE
│ │ ├── html/
│ │ │ ├── HTML5.sketch/
│ │ │ │ ├── Data
│ │ │ │ ├── fonts
│ │ │ │ └── version
│ │ │ └── SOURCE
│ │ ├── htmx/
│ │ │ └── SOURCE
│ │ ├── http/
│ │ │ ├── 16.pxm
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── i3/
│ │ │ └── SOURCE
│ │ ├── immutable/
│ │ │ └── SOURCE
│ │ ├── jasmine/
│ │ │ └── SOURCE
│ │ ├── javascript/
│ │ │ ├── 16.pxm
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── jekyll/
│ │ │ └── SOURCE
│ │ ├── jest/
│ │ │ └── SOURCE
│ │ ├── jinja/
│ │ │ └── SOURCE
│ │ ├── joi/
│ │ │ └── SOURCE
│ │ ├── jq/
│ │ │ └── SOURCE
│ │ ├── jquery/
│ │ │ └── SOURCE
│ │ ├── jquerymobile/
│ │ │ └── SOURCE
│ │ ├── jqueryui/
│ │ │ └── SOURCE
│ │ ├── julia/
│ │ │ └── SOURCE
│ │ ├── knockout/
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── kotlin/
│ │ │ └── SOURCE
│ │ ├── kubectl/
│ │ │ └── SOURCE
│ │ ├── kubernetes/
│ │ │ └── SOURCE
│ │ ├── laravel/
│ │ │ └── SOURCE
│ │ ├── latex/
│ │ │ └── SOURCE
│ │ ├── leaflet/
│ │ │ └── SOURCE
│ │ ├── less/
│ │ │ └── less.pxm
│ │ ├── lit/
│ │ │ └── SOURCE
│ │ ├── lodash/
│ │ │ └── SOURCE
│ │ ├── love/
│ │ │ └── SOURCE
│ │ ├── lua/
│ │ │ └── SOURCE
│ │ ├── man/
│ │ │ └── SOURCE
│ │ ├── mariadb/
│ │ │ └── SOURCE
│ │ ├── marionette/
│ │ │ └── SOURCE
│ │ ├── markdown/
│ │ │ └── SOURCE
│ │ ├── matplotlib/
│ │ │ └── SOURCE
│ │ ├── meteor/
│ │ │ └── SOURCE
│ │ ├── minitest/
│ │ │ └── SOURCE
│ │ ├── mocha/
│ │ │ └── SOURCE
│ │ ├── modernizr/
│ │ │ └── SOURCE
│ │ ├── moment/
│ │ │ └── moment.sketch/
│ │ │ ├── Data
│ │ │ ├── fonts
│ │ │ ├── metadata
│ │ │ └── version
│ │ ├── moment_timezone/
│ │ │ └── SOURCE
│ │ ├── nextjs/
│ │ │ └── SOURCE
│ │ ├── nginx/
│ │ │ └── SOURCE
│ │ ├── nim/
│ │ │ └── SOURCE
│ │ ├── nix/
│ │ │ └── SOURCE
│ │ ├── node/
│ │ │ └── SOURCE
│ │ ├── nokogiri/
│ │ │ └── icon.pxm
│ │ ├── npm/
│ │ │ └── SOURCE
│ │ ├── numpy/
│ │ │ └── SOURCE
│ │ ├── nushell/
│ │ │ └── SOURCE
│ │ ├── ocaml/
│ │ │ └── SOURCE
│ │ ├── octave/
│ │ │ └── SOURCE
│ │ ├── opengl/
│ │ │ └── SOURCE
│ │ ├── openlayers/
│ │ │ └── SOURCE
│ │ ├── padrino/
│ │ │ └── SOURCE
│ │ ├── pandas/
│ │ │ └── SOURCE
│ │ ├── perl/
│ │ │ └── SOURCE
│ │ ├── phalcon/
│ │ │ └── SOURCE
│ │ ├── phaser/
│ │ │ └── SOURCE
│ │ ├── phoenix/
│ │ │ └── SOURCE
│ │ ├── php/
│ │ │ ├── 16@2x.pxm
│ │ │ └── SOURCE
│ │ ├── phpunit/
│ │ │ └── SOURCE
│ │ ├── playwright/
│ │ │ └── SOURCE
│ │ ├── point_cloud_library/
│ │ │ └── SOURCE
│ │ ├── pony/
│ │ │ └── SOURCE
│ │ ├── postgresql/
│ │ │ └── SOURCE
│ │ ├── prettier/
│ │ │ └── SOURCE
│ │ ├── pug/
│ │ │ └── SOURCE
│ │ ├── puppeteer/
│ │ │ └── SOURCE
│ │ ├── pygame/
│ │ │ └── SOURCE
│ │ ├── python/
│ │ │ └── SOURCE
│ │ ├── pytorch/
│ │ │ └── SOURCE
│ │ ├── q/
│ │ │ └── SOURCE
│ │ ├── qt/
│ │ │ └── SOURCE
│ │ ├── qunit/
│ │ │ └── SOURCE
│ │ ├── r/
│ │ │ └── SOURCE
│ │ ├── rails/
│ │ │ ├── SOURCE
│ │ │ └── rails.pxm
│ │ ├── ramda/
│ │ │ └── SOURCE
│ │ ├── react/
│ │ │ └── SOURCE
│ │ ├── react_bootstrap/
│ │ │ └── SOURCE
│ │ ├── react_native/
│ │ │ └── SOURCE
│ │ ├── react_router/
│ │ │ └── SOURCE
│ │ ├── reactivex/
│ │ │ └── SOURCE
│ │ ├── redis/
│ │ │ └── SOURCE
│ │ ├── redux/
│ │ │ └── SOURCE
│ │ ├── requests/
│ │ │ └── SOURCE
│ │ ├── requirejs/
│ │ │ └── SOURCE
│ │ ├── rethinkdb/
│ │ │ └── SOURCE
│ │ ├── ruby/
│ │ │ └── SOURCE
│ │ ├── rust/
│ │ │ └── SOURCE
│ │ ├── rxjs/
│ │ │ └── SOURCE
│ │ ├── saltstack/
│ │ │ └── SOURCE
│ │ ├── sanctuary/
│ │ │ └── SOURCE
│ │ ├── sanctuary_def/
│ │ │ └── SOURCE
│ │ ├── sanctuary_type_classes/
│ │ │ └── SOURCE
│ │ ├── sass/
│ │ │ ├── SOURCE
│ │ │ └── sass.pxm
│ │ ├── scikit_image/
│ │ │ └── SOURCE
│ │ ├── scikit_learn/
│ │ │ └── SOURCE
│ │ ├── sequelize/
│ │ │ └── SOURCE
│ │ ├── sinon/
│ │ │ └── SOURCE
│ │ ├── socketio/
│ │ │ └── SOURCE
│ │ ├── spring_boot/
│ │ │ └── SOURCE
│ │ ├── sqlite/
│ │ │ └── SOURCE
│ │ ├── statsmodels/
│ │ │ └── SOURCE
│ │ ├── support_tables/
│ │ │ └── SOURCE
│ │ ├── svelte/
│ │ │ └── SOURCE
│ │ ├── svg/
│ │ │ └── SOURCE
│ │ ├── symfony/
│ │ │ └── SOURCE
│ │ ├── tailwindcss/
│ │ │ └── SOURCE
│ │ ├── tcl_tk/
│ │ │ └── SOURCE
│ │ ├── tcllib/
│ │ │ └── SOURCE
│ │ ├── tensorflow/
│ │ │ └── SOURCE
│ │ ├── tensorflow_cpp/
│ │ │ └── SOURCE
│ │ ├── terraform/
│ │ │ └── SOURCE
│ │ ├── threejs/
│ │ │ └── SOURCE
│ │ ├── trio/
│ │ │ └── SOURCE
│ │ ├── twig/
│ │ │ └── SOURCE
│ │ ├── typescript/
│ │ │ └── SOURCE
│ │ ├── underscore/
│ │ │ └── SOURCE
│ │ ├── vagrant/
│ │ │ └── SOURCE
│ │ ├── varnish/
│ │ │ └── SOURCE
│ │ ├── vertx/
│ │ │ └── SOURCE
│ │ ├── vite/
│ │ │ └── SOURCE
│ │ ├── vitest/
│ │ │ └── SOURCE
│ │ ├── vue/
│ │ │ └── SOURCE
│ │ ├── vue_router/
│ │ │ └── SOURCE
│ │ ├── vueuse/
│ │ │ └── SOURCE
│ │ ├── vuex/
│ │ │ └── SOURCE
│ │ ├── vulkan/
│ │ │ └── SOURCE
│ │ ├── wagtail/
│ │ │ └── SOURCE
│ │ ├── webpack/
│ │ │ └── SOURCE
│ │ ├── werkzeug/
│ │ │ └── SOURCE
│ │ ├── wordpress/
│ │ │ └── SOURCE
│ │ ├── xpath/
│ │ │ └── XPath.sketch/
│ │ │ ├── Data
│ │ │ ├── metadata
│ │ │ └── version
│ │ ├── yarn/
│ │ │ └── SOURCE
│ │ ├── yii/
│ │ │ └── SOURCE
│ │ ├── zig/
│ │ │ └── SOURCE
│ │ └── zsh/
│ │ └── SOURCE
│ ├── images/
│ │ ├── apple-icon.pxm
│ │ ├── fluid-icon.pxm
│ │ ├── icon.pxm
│ │ └── webapp-icon-small.pxm
│ ├── manifest.json
│ ├── mathml.css
│ ├── opensearch.xml
│ └── robots.txt
├── renovate.json
├── techstack.md
├── techstack.yml
├── test/
│ ├── app_test.rb
│ ├── files/
│ │ └── docs.json
│ ├── lib/
│ │ └── docs/
│ │ ├── core/
│ │ │ ├── doc_test.rb
│ │ │ ├── entry_index_test.rb
│ │ │ ├── filter_test.rb
│ │ │ ├── instrumentable_test.rb
│ │ │ ├── manifest_test.rb
│ │ │ ├── models/
│ │ │ │ ├── entry_test.rb
│ │ │ │ └── type_test.rb
│ │ │ ├── parser_test.rb
│ │ │ ├── request_test.rb
│ │ │ ├── requester_test.rb
│ │ │ ├── response_test.rb
│ │ │ ├── scraper_test.rb
│ │ │ ├── scrapers/
│ │ │ │ ├── file_scraper_test.rb
│ │ │ │ └── url_scraper_test.rb
│ │ │ └── url_test.rb
│ │ ├── filters/
│ │ │ └── core/
│ │ │ ├── apply_base_url_test.rb
│ │ │ ├── clean_html_test.rb
│ │ │ ├── clean_text_test.rb
│ │ │ ├── container_test.rb
│ │ │ ├── entries_test.rb
│ │ │ ├── inner_html_test.rb
│ │ │ ├── internal_urls_test.rb
│ │ │ ├── normalize_paths_test.rb
│ │ │ ├── normalize_urls_test.rb
│ │ │ ├── parse_cf_email_test.rb
│ │ │ └── title_test.rb
│ │ └── storage/
│ │ ├── abstract_store_test.rb
│ │ └── file_store_test.rb
│ ├── support/
│ │ ├── fake_instrumentation.rb
│ │ └── filter_test_helper.rb
│ └── test_helper.rb
└── views/
├── app.erb
├── index.erb
├── other.erb
├── service-worker.js.erb
└── unsupported.erb
Showing preview only (285K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4675 symbols across 885 files)
FILE: assets/javascripts/app/app.js
class App (line 1) | class App extends Events {
method init (line 10) | init() {
method browserCheck (line 49) | browserCheck() {
method initErrorTracking (line 58) | initErrorTracking() {
method bootOne (line 110) | bootOne() {
method bootAll (line 120) | bootAll() {
method start (line 133) | start() {
method initDoc (line 155) | initDoc(doc) {
method migrateDocs (line 162) | migrateDocs() {
method enableDoc (line 193) | enableDoc(doc, _onSuccess, onError) {
method saveDocs (line 217) | saveDocs() {
method welcomeBack (line 225) | welcomeBack() {
method reboot (line 236) | reboot() {
method reload (line 244) | reload() {
method reset (line 254) | reset() {
method showTip (line 266) | showTip(tip) {
method hideLoadingScreen (line 278) | hideLoadingScreen() {
method indexHost (line 285) | indexHost() {
method onBootError (line 295) | onBootError(...args) {
method onQuotaExceeded (line 300) | onQuotaExceeded() {
method onCookieBlocked (line 308) | onCookieBlocked(key, value, actual) {
method onWindowError (line 320) | onWindowError(...args) {
method onInjectionError (line 338) | onInjectionError() {
method isInjectionError (line 348) | isInjectionError() {
method isAppError (line 360) | isAppError(error, file) {
method isSupportedBrowser (line 365) | isSupportedBrowser() {
method isSingleDoc (line 395) | isSingleDoc() {
method isMobile (line 399) | isMobile() {
method isAndroidWebview (line 405) | isAndroidWebview() {
method isInvalidLocation (line 411) | isInvalidLocation() {
FILE: assets/javascripts/app/db.js
method constructor (line 5) | constructor() {
method db (line 11) | db(fn) {
method onOpenSuccess (line 36) | onOpenSuccess(event) {
method onOpenError (line 59) | onOpenError(event) {
method fail (line 79) | fail(reason, error) {
method onQuotaExceededError (line 102) | onQuotaExceededError() {
method onVersionError (line 109) | onVersionError() {
method handleVersionMismatch (line 120) | handleVersionMismatch(actualVersion) {
method buggyIDB (line 129) | buggyIDB(db) {
method runCallbacks (line 145) | runCallbacks(db) {
method onUpgradeNeeded (line 152) | onUpgradeNeeded(event) {
method store (line 181) | store(doc, data, onSuccess, onError, _retry) {
method unstore (line 226) | unstore(doc, onSuccess, onError, _retry) {
method version (line 267) | version(doc, fn) {
method cachedVersion (line 297) | cachedVersion(doc) {
method versions (line 304) | versions(docs, fn) {
method cachedVersions (line 340) | cachedVersions(docs) {
method load (line 351) | load(entry, onSuccess, onError) {
method loadWithXHR (line 361) | loadWithXHR(entry, onSuccess, onError) {
method loadWithIDB (line 370) | loadWithIDB(entry, onSuccess, onError) {
method loadDocsCache (line 405) | loadDocsCache(db) {
method checkForCorruptedDocs (line 433) | checkForCorruptedDocs() {
method deleteCorruptedDocs (line 487) | deleteCorruptedDocs() {
method shouldLoadWithIDB (line 507) | shouldLoadWithIDB(entry) {
method idbTransaction (line 513) | idbTransaction(db, options) {
method reset (line 529) | reset() {
method useIndexedDB (line 535) | useIndexedDB() {
method migrate (line 548) | migrate() {
method setUserVersion (line 552) | setUserVersion(version) {
method userVersion (line 556) | userVersion() {
FILE: assets/javascripts/app/router.js
method constructor (line 16) | constructor() {
method start (line 24) | start() {
method show (line 28) | show(path) {
method triggerRoute (line 32) | triggerRoute(name) {
method before (line 37) | before(context, next) {
method doc (line 51) | doc(context, next) {
method type (line 67) | type(context, next) {
method entry (line 81) | entry(context, next) {
method root (line 112) | root() {
method settings (line 119) | settings(context) {
method offline (line 126) | offline(context) {
method about (line 133) | about(context) {
method news (line 141) | news(context) {
method help (line 149) | help(context) {
method notFound (line 157) | notFound(context) {
method isIndex (line 161) | isIndex() {
method isSettings (line 168) | isSettings() {
method setInitialPath (line 172) | setInitialPath() {
method getInitialPathFromHash (line 188) | getInitialPathFromHash() {
method getInitialPathFromCookie (line 194) | getInitialPathFromCookie() {
method replaceHash (line 202) | replaceHash(hash) {
FILE: assets/javascripts/app/searcher.js
constant SEPARATOR (line 18) | const SEPARATOR = ".";
function exactMatch (line 36) | function exactMatch() {
function scoreExactMatch (line 54) | function scoreExactMatch() {
function fuzzyMatch (line 108) | function fuzzyMatch() {
function scoreFuzzyMatch (line 131) | function scoreFuzzyMatch() {
method normalizeString (line 169) | static normalizeString(string) {
method normalizeQuery (line 181) | static normalizeQuery(string) {
method constructor (line 186) | constructor(options) {
method find (line 191) | find(data, attr, q) {
method setup (line 206) | setup() {
method setupFuzzy (line 215) | setupFuzzy() {
method isValid (line 224) | isValid() {
method end (line 228) | end() {
method kill (line 236) | kill() {
method free (line 243) | free() {
method match (line 256) | match() {
method setupMatcher (line 265) | setupMatcher() {
method matchChunks (line 270) | matchChunks() {
method matchChunk (line 281) | matchChunk() {
method chunkSize (line 306) | chunkSize() {
method scoredEnough (line 314) | scoredEnough() {
method foundEnough (line 318) | foundEnough() {
method addResult (line 322) | addResult(object, score) {
method getResults (line 330) | getResults() {
method sendResults (line 341) | sendResults() {
method triggerResults (line 348) | triggerResults(results) {
method delay (line 352) | delay(fn) {
method queryToFuzzyRegexp (line 356) | queryToFuzzyRegexp(string) {
method match (line 367) | match() {
method free (line 377) | free() {
method end (line 382) | end() {
method sendResults (line 387) | sendResults(end) {
method delay (line 393) | delay(fn) {
FILE: assets/javascripts/app/serviceworker.js
method isEnabled (line 2) | static isEnabled() {
method constructor (line 6) | constructor() {
method update (line 20) | update() {
method updateInBackground (line 28) | updateInBackground() {
method reload (line 36) | reload() {
method updateRegistration (line 40) | updateRegistration(registration) {
method onUpdateFound (line 45) | onUpdateFound() {
method onStateChange (line 53) | onStateChange() {
method onUpdateReady (line 64) | onUpdateReady() {
FILE: assets/javascripts/app/settings.js
method constructor (line 45) | constructor() {
method get (line 56) | get(key) {
method set (line 72) | set(key, value) {
method del (line 80) | del(key) {
method hasDocs (line 85) | hasDocs() {
method getDocs (line 91) | getDocs() {
method setDocs (line 95) | setDocs(docs) {
method getTips (line 99) | getTips() {
method setTips (line 103) | setTips(tips) {
method setLayout (line 107) | setLayout(name, enable) {
method hasLayout (line 128) | hasLayout(name) {
method setSize (line 133) | setSize(value) {
method dump (line 137) | dump() {
method export (line 141) | export() {
method import (line 149) | import(data) {
method reset (line 166) | reset() {
method initLayout (line 171) | initLayout() {
method setTheme (line 183) | setTheme(theme) {
method updateColorMeta (line 193) | updateColorMeta() {
method toggleLayout (line 200) | toggleLayout(layout, enable) {
method initSidebarWidth (line 209) | initSidebarWidth() {
FILE: assets/javascripts/app/shortcuts.js
method constructor (line 2) | constructor() {
method start (line 10) | start() {
method stop (line 15) | stop() {
method swapArrowKeysBehavior (line 20) | swapArrowKeysBehavior() {
method spaceScroll (line 24) | spaceScroll() {
method showTip (line 28) | showTip() {
method spaceTimeout (line 33) | spaceTimeout() {
method onKeydown (line 37) | onKeydown(event) {
method onKeypress (line 62) | onKeypress(event) {
method handleKeydownEvent (line 77) | handleKeydownEvent(event, _force) {
method handleKeydownSuperEvent (line 162) | handleKeydownSuperEvent(event) {
method handleKeydownShiftEvent (line 190) | handleKeydownShiftEvent(event, _force) {
method handleKeydownAltEvent (line 223) | handleKeydownAltEvent(event, _force) {
method handleKeypressEvent (line 276) | handleKeypressEvent(event) {
method buggyEvent (line 285) | buggyEvent(event) {
FILE: assets/javascripts/app/update_checker.js
method constructor (line 2) | constructor() {
method check (line 13) | check() {
method onUpdateReady (line 29) | onUpdateReady() {
method checkDocs (line 33) | checkDocs() {
method onDocsUpdateReady (line 45) | onDocsUpdateReady() {
method onFocus (line 49) | onFocus() {
FILE: assets/javascripts/collections/collection.js
method constructor (line 2) | constructor(objects) {
method model (line 9) | model() {
method reset (line 13) | reset(objects) {
method add (line 23) | add(object) {
method remove (line 37) | remove(model) {
method size (line 41) | size() {
method isEmpty (line 45) | isEmpty() {
method each (line 49) | each(fn) {
method all (line 55) | all() {
method contains (line 59) | contains(model) {
method findBy (line 63) | findBy(attr, value) {
method findAllBy (line 67) | findAllBy(attr, value) {
method countAllBy (line 71) | countAllBy(attr, value) {
FILE: assets/javascripts/collections/docs.js
method findBySlug (line 10) | findBySlug(slug) {
method sort (line 15) | sort() {
method load (line 40) | load(onComplete, onError, options) {
method clearCache (line 65) | clearCache() {
method uninstall (line 71) | uninstall(callback) {
method getInstallStatuses (line 83) | getInstallStatuses(callback) {
method checkForUpdates (line 95) | checkForUpdates(callback) {
method updateInBackground (line 110) | updateInBackground() {
FILE: assets/javascripts/collections/types.js
method groups (line 7) | groups() {
method _groupFor (line 17) | _groupFor(type) {
FILE: assets/javascripts/debug.js
method setup (line 26) | setup() {
method match (line 32) | match() {
method setupMatcher (line 39) | setupMatcher() {
method end (line 44) | end() {
method kill (line 51) | kill() {
FILE: assets/javascripts/lib/ajax.js
constant MIME_TYPES (line 1) | const MIME_TYPES = {
function ajax (line 6) | function ajax(options) {
FILE: assets/javascripts/lib/cookies_store.js
class CookiesStore (line 4) | class CookiesStore {
method onBlocked (line 7) | static onBlocked() {}
method get (line 9) | get(key) {
method set (line 17) | set(key, value) {
method del (line 40) | del(key) {
method reset (line 44) | reset() {
method dump (line 53) | dump() {
FILE: assets/javascripts/lib/events.js
class Events (line 1) | class Events {
method on (line 2) | on(event, callback) {
method off (line 15) | off(event, callback) {
method trigger (line 33) | trigger(event, ...args) {
method removeEvent (line 50) | removeEvent(event) {
FILE: assets/javascripts/lib/local_storage_store.js
method get (line 2) | get(key) {
method set (line 8) | set(key, value) {
method del (line 15) | del(key) {
method reset (line 22) | reset() {
FILE: assets/javascripts/lib/page.js
class Context (line 100) | class Context {
method isIntialState (line 101) | static isIntialState(state) {
method isLastState (line 105) | static isLastState(state) {
method isInitialPopState (line 109) | static isInitialPopState(state) {
method isSameSession (line 113) | static isSameSession(state) {
method constructor (line 117) | constructor(path, state) {
method pushState (line 147) | pushState() {
method replaceState (line 151) | replaceState() {
class Route (line 158) | class Route {
method constructor (line 159) | constructor(path, options) {
method middleware (line 168) | middleware(fn) {
method match (line 180) | match(path, params) {
FILE: assets/javascripts/lib/util.js
constant ESCAPE_HTML_MAP (line 433) | const ESCAPE_HTML_MAP = {
constant ESCAPE_HTML_REGEXP (line 442) | const ESCAPE_HTML_REGEXP = /[&<>"'\/]/g;
constant ESCAPE_REGEXP (line 447) | const ESCAPE_REGEXP = /([.*+?^=!:${}()|\[\]\/\\])/g;
constant HIGHLIGHT_DEFAULTS (line 529) | const HIGHLIGHT_DEFAULTS = {
FILE: assets/javascripts/models/doc.js
method constructor (line 4) | constructor() {
method reset (line 16) | reset(data) {
method resetEntries (line 21) | resetEntries(entries) {
method resetTypes (line 28) | resetTypes(types) {
method fullPath (line 35) | fullPath(path) {
method fileUrl (line 45) | fileUrl(path) {
method dbUrl (line 49) | dbUrl() {
method indexUrl (line 53) | indexUrl() {
method toEntry (line 59) | toEntry() {
method findEntryByPathAndHash (line 74) | findEntryByPathAndHash(path, hash) {
method load (line 85) | load(onSuccess, onError, options) {
method clearCache (line 108) | clearCache() {
method _loadFromCache (line 112) | _loadFromCache(onSuccess) {
method _getCache (line 127) | _getCache() {
method _setCache (line 141) | _setCache(data) {
method install (line 145) | install(onSuccess, onError, onProgress) {
method uninstall (line 170) | uninstall(onSuccess, onError) {
method getInstallStatus (line 189) | getInstallStatus(callback) {
method isOutdated (line 195) | isOutdated(status) {
FILE: assets/javascripts/models/entry.js
method applyAliases (line 4) | static applyAliases(string) {
method constructor (line 22) | constructor() {
method addAlias (line 27) | addAlias(name) {
method fullPath (line 35) | fullPath() {
method dbPath (line 39) | dbPath() {
method filePath (line 43) | filePath() {
method fileUrl (line 47) | fileUrl() {
method _filePath (line 51) | _filePath() {
method isIndex (line 59) | isIndex() {
method getType (line 63) | getType() {
method loadFile (line 67) | loadFile(onSuccess, onError) {
FILE: assets/javascripts/models/model.js
method constructor (line 2) | constructor(attributes) {
FILE: assets/javascripts/models/type.js
method fullPath (line 4) | fullPath() {
method entries (line 8) | entries() {
method toEntry (line 12) | toEntry() {
FILE: assets/javascripts/vendor/prism.js
function insertHighlightedCode (line 587) | function insertHighlightedCode(highlightedCode) {
function Token (line 785) | function Token(type, content, alias, matchedStr) {
function matchPattern (line 892) | function matchPattern(pattern, pos, text, lookbehind) {
function matchGrammar (line 918) | function matchGrammar(text, tokenList, grammar, startNode, startPos, rem...
function LinkedList (line 1078) | function LinkedList() {
function addAfter (line 1101) | function addAfter(list, node, value) {
function removeRange (line 1120) | function removeRange(list, node, count) {
function toArray (line 1134) | function toArray(list) {
function highlightAutomaticallyCallback (line 1180) | function highlightAutomaticallyCallback() {
function getPlaceholder (line 2755) | function getPlaceholder(language, index) {
function walkTokens (line 2819) | function walkTokens(tokens) {
function withID (line 2961) | function withID(source, flags) {
function createInline (line 3627) | function createInline(pattern) {
function walkTokens (line 3877) | function walkTokens(tokens) {
function textContent (line 3993) | function textContent(html) {
function re (line 4905) | function re(source, flags) {
function createValuePattern (line 5536) | function createValuePattern(value, flags) {
function literal (line 5599) | function literal(str) {
FILE: assets/javascripts/vendor/raven.js
function s (line 34) | function s(o, u) {
function RavenConfigError (line 67) | function RavenConfigError(message) {
function now (line 170) | function now() {
function keepOriginalCallback (line 186) | function keepOriginalCallback(original, callback) {
function Raven (line 197) | function Raven() {
function wrapped (line 495) | function wrapped() {
function wrapTimeFn (line 1176) | function wrapTimeFn(orig) {
function wrapEventTarget (line 1203) | function wrapEventTarget(global) {
function wrapProp (line 1359) | function wrapProp(prop, xhr) {
function onreadystatechangeHandler (line 1402) | function onreadystatechangeHandler() {
function isObject (line 2356) | function isObject(what) {
function isError (line 2362) | function isError(value) {
function isErrorEvent (line 2375) | function isErrorEvent(value) {
function isUndefined (line 2382) | function isUndefined(what) {
function isFunction (line 2386) | function isFunction(what) {
function isString (line 2390) | function isString(what) {
function isArray (line 2394) | function isArray(what) {
function isEmptyObject (line 2398) | function isEmptyObject(what) {
function supportsErrorEvent (line 2407) | function supportsErrorEvent() {
function wrappedCallback (line 2416) | function wrappedCallback(callback) {
function each (line 2428) | function each(obj, callback) {
function objectMerge (line 2447) | function objectMerge(obj1, obj2) {
function objectFrozen (line 2465) | function objectFrozen(obj) {
function truncate (line 2472) | function truncate(str, max) {
function hasKey (line 2485) | function hasKey(object, key) {
function joinRegExp (line 2489) | function joinRegExp(patterns) {
function urlencode (line 2514) | function urlencode(o) {
function parseUrl (line 2527) | function parseUrl(url) {
function uuid4 (line 2543) | function uuid4() {
function htmlTreeAsString (line 2595) | function htmlTreeAsString(elem) {
function htmlElementAsString (line 2636) | function htmlElementAsString(elem) {
function isOnlyOneTruthy (line 2674) | function isOnlyOneTruthy(a, b) {
function isSameException (line 2681) | function isSameException(ex1, ex2) {
function isSameStacktrace (line 2696) | function isSameStacktrace(stack1, stack2) {
function fill (line 2728) | function fill(obj, name, replacement, track) {
function getLocationHref (line 2815) | function getLocationHref() {
function subscribe (line 2871) | function subscribe(handler) {
function unsubscribe (line 2880) | function unsubscribe(handler) {
function unsubscribeAll (line 2891) | function unsubscribeAll() {
function notifyHandlers (line 2900) | function notifyHandlers(stack, isWindowError) {
function traceKitWindowOnError (line 2936) | function traceKitWindowOnError(message, url, lineNo, colNo, ex) {
function installGlobalHandler (line 2991) | function installGlobalHandler() {
function uninstallGlobalHandler (line 3000) | function uninstallGlobalHandler() {
function processLastException (line 3009) | function processLastException() {
function report (line 3028) | function report(ex, rethrow) {
function computeStackTraceFromStackProp (line 3162) | function computeStackTraceFromStackProp(ex) {
function augmentStackTraceWithInitialElement (line 3267) | function augmentStackTraceWithInitialElement(
function computeStackTraceByWalkingCallerChain (line 3318) | function computeStackTraceByWalkingCallerChain(ex, depth) {
function computeStackTrace (line 3395) | function computeStackTrace(ex, depth) {
function indexOf (line 3465) | function indexOf(haystack, needle) {
function stringify (line 3472) | function stringify(obj, replacer, spaces, cycleReplacer) {
function stringifyError (line 3481) | function stringifyError(value) {
function serializer (line 3498) | function serializer(replacer, cycleReplacer) {
FILE: assets/javascripts/views/content/content.js
method init (line 22) | init() {
method show (line 45) | show(view) {
method showLoading (line 56) | showLoading() {
method isLoading (line 60) | isLoading() {
method hideLoading (line 64) | hideLoading() {
method scrollTo (line 68) | scrollTo(value) {
method smoothScrollTo (line 72) | smoothScrollTo(value) {
method scrollBy (line 80) | scrollBy(n) {
method scrollToTop (line 84) | scrollToTop() {
method scrollToBottom (line 88) | scrollToBottom() {
method scrollStepUp (line 92) | scrollStepUp() {
method scrollStepDown (line 96) | scrollStepDown() {
method scrollPageUp (line 100) | scrollPageUp() {
method scrollPageDown (line 104) | scrollPageDown() {
method scrollToTarget (line 108) | scrollToTarget() {
method onReady (line 124) | onReady() {
method onBootError (line 128) | onBootError() {
method onEntryLoading (line 133) | onEntryLoading() {
method onEntryLoaded (line 141) | onEntryLoaded() {
method beforeRoute (line 150) | beforeRoute(context) {
method cacheScrollPosition (line 156) | cacheScrollPosition() {
method afterRoute (line 174) | afterRoute(route, context) {
method onClick (line 207) | onClick(event) {
method onAltF (line 215) | onAltF(event) {
method findTargetByHash (line 225) | findTargetByHash(hash) {
method isExternalUrl (line 241) | isExternalUrl(url) {
FILE: assets/javascripts/views/content/entry_page.js
method init (line 19) | init() {
method deactivate (line 24) | deactivate() {
method loading (line 31) | loading() {
method render (line 36) | render(content, fromCache) {
method addCopyButtons (line 65) | addCopyButtons() {
method polyfillMathML (line 79) | polyfillMathML() {
method prepareContent (line 94) | prepareContent(content) {
method empty (line 106) | empty() {
method subViewClass (line 121) | subViewClass() {
method getTitle (line 127) | getTitle() {
method beforeRoute (line 134) | beforeRoute() {
method onRoute (line 139) | onRoute(context) {
method load (line 147) | load() {
method abort (line 155) | abort() {
method onSuccess (line 162) | onSuccess(response) {
method onError (line 170) | onError() {
method cache (line 180) | cache() {
method restore (line 198) | restore() {
method onClick (line 206) | onClick(event) {
method onAltC (line 221) | onAltC() {
method onAltO (line 230) | onAltO() {
FILE: assets/javascripts/views/content/offline_page.js
method deactivate (line 9) | deactivate() {
method render (line 15) | render() {
method renderDoc (line 38) | renderDoc(doc, status) {
method getTitle (line 42) | getTitle() {
method refreshLinks (line 46) | refreshLinks() {
method docByEl (line 54) | docByEl(el) {
method docEl (line 62) | docEl(doc) {
method onRoute (line 66) | onRoute(context) {
method onClick (line 70) | onClick(event) {
method onInstallSuccess (line 99) | onInstallSuccess(doc) {
method onInstallError (line 116) | onInstallError(doc) {
method onInstallProgress (line 126) | onInstallProgress(doc, event) {
method onChange (line 140) | onChange(event) {
FILE: assets/javascripts/views/content/root_page.js
method init (line 4) | init() {
method render (line 11) | render() {
method hideIntro (line 25) | hideIntro() {
method setHidden (line 30) | setHidden(value) {
method isHidden (line 34) | isHidden() {
method onRoute (line 38) | onRoute() {}
method onClick (line 40) | onClick(event) {
FILE: assets/javascripts/views/content/settings_page.js
method render (line 9) | render() {
method currentSettings (line 13) | currentSettings() {
method getTitle (line 31) | getTitle() {
method setTheme (line 35) | setTheme(value) {
method toggleLayout (line 39) | toggleLayout(layout, enable) {
method toggleSmoothScroll (line 43) | toggleSmoothScroll(enable) {
method toggleAnalyticsConsent (line 47) | toggleAnalyticsConsent(enable) {
method toggleSpaceScroll (line 54) | toggleSpaceScroll(enable) {
method setScrollTimeout (line 58) | setScrollTimeout(value) {
method toggle (line 62) | toggle(name, enable) {
method export (line 66) | export() {
method import (line 79) | import(file, input) {
method onChange (line 102) | onChange(event) {
method onClick (line 131) | onClick(event) {
method onRoute (line 141) | onRoute(context) {
FILE: assets/javascripts/views/content/static_page.js
method deactivate (line 11) | deactivate() {
method render (line 18) | render(page) {
method getTitle (line 23) | getTitle() {
method onRoute (line 27) | onRoute(context) {
FILE: assets/javascripts/views/content/type_page.js
method deactivate (line 4) | deactivate() {
method render (line 11) | render(type) {
method getTitle (line 17) | getTitle() {
method onRoute (line 21) | onRoute(context) {
FILE: assets/javascripts/views/layout/document.js
method init (line 16) | init() {
method setTitle (line 39) | setTitle(title) {
method afterRoute (line 45) | afterRoute(route) {
method onVisibilityChange (line 57) | onVisibilityChange() {
method onHelp (line 68) | onHelp() {
method onPreferences (line 72) | onPreferences() {
method onEscape (line 76) | onEscape() {
method onBack (line 85) | onBack() {
method onForward (line 89) | onForward() {
method onClick (line 93) | onClick(event) {
FILE: assets/javascripts/views/layout/menu.js
method init (line 7) | init() {
method onClick (line 11) | onClick(event) {
method onGlobalClick (line 18) | onGlobalClick(event) {
FILE: assets/javascripts/views/layout/mobile.js
method detect (line 15) | static detect() {
method detectAndroidWebview (line 36) | static detectAndroidWebview() {
method constructor (line 44) | constructor() {
method init (line 48) | init() {
method showSidebar (line 78) | showSidebar() {
method hideSidebar (line 104) | hideSidebar() {
method isSidebarShown (line 114) | isSidebarShown() {
method onClickBack (line 118) | onClickBack() {
method onClickForward (line 122) | onClickForward() {
method onClickToggleSidebar (line 126) | onClickToggleSidebar() {
method onClickDocPickerTab (line 134) | onClickDocPickerTab(event) {
method onClickSettingsTab (line 139) | onClickSettingsTab(event) {
method showDocPicker (line 144) | showDocPicker() {
method showSettings (line 152) | showSettings() {
method onTapSearch (line 160) | onTapSearch() {
method onEscape (line 164) | onEscape() {
method afterRoute (line 168) | afterRoute(route) {
FILE: assets/javascripts/views/layout/path.js
method render (line 9) | render(...args) {
method show (line 14) | show() {
method hide (line 20) | hide() {
method onClick (line 26) | onClick(event) {
method afterRoute (line 33) | afterRoute(route, context) {
FILE: assets/javascripts/views/layout/resizer.js
method isSupported (line 12) | static isSupported() {
method init (line 16) | init() {
method resize (line 21) | resize(value, save) {
method onDragStart (line 34) | onDragStart(event) {
method onDrag (line 41) | onDrag(event) {
method onDragEnd (line 54) | onDragEnd(event) {
FILE: assets/javascripts/views/layout/settings.js
method init (line 21) | init() {
method activate (line 25) | activate() {
method deactivate (line 32) | deactivate() {
method render (line 42) | render() {
method save (line 48) | save(options) {
method onChange (line 82) | onChange() {
method onEnter (line 86) | onEnter() {
method onSubmit (line 90) | onSubmit(event) {
method onImport (line 95) | onImport() {
method onClick (line 100) | onClick(event) {
FILE: assets/javascripts/views/list/list_focus.js
method constructor (line 15) | constructor(el) {
method focus (line 20) | focus(el, options) {
method blur (line 33) | blur() {
method getCursor (line 41) | getCursor() {
method findNext (line 48) | findNext(cursor) {
method findFirst (line 73) | findFirst(cursor) {
method findPrev (line 88) | findPrev(cursor) {
method findLast (line 113) | findLast(cursor) {
method onDown (line 130) | onDown() {
method onUp (line 139) | onUp() {
method onLeft (line 148) | onLeft() {
method onEnter (line 162) | onEnter() {
method onSuperEnter (line 169) | onSuperEnter() {
method onClick (line 176) | onClick(event) {
FILE: assets/javascripts/views/list/list_fold.js
method open (line 13) | open(el) {
method close (line 20) | close(el) {
method toggle (line 27) | toggle(el) {
method reset (line 35) | reset() {
method getCursor (line 42) | getCursor() {
method onLeft (line 49) | onLeft() {
method onRight (line 56) | onRight() {
method onClick (line 67) | onClick(event) {
FILE: assets/javascripts/views/list/list_select.js
method deactivate (line 6) | deactivate() {
method select (line 12) | select(el) {
method deselect (line 20) | deselect() {
method selectByHref (line 28) | selectByHref(href) {
method selectCurrent (line 34) | selectCurrent() {
method getSelection (line 38) | getSelection() {
method onClick (line 42) | onClick(event) {
FILE: assets/javascripts/views/list/paginated_list.js
method constructor (line 4) | constructor(data) {
method renderPaginated (line 13) | renderPaginated() {
method renderAll (line 25) | renderAll() {
method renderPage (line 29) | renderPage(page) {
method renderPageLink (line 38) | renderPageLink(count) {
method renderPrevLink (line 42) | renderPrevLink(page) {
method renderNextLink (line 46) | renderNextLink(page) {
method totalPages (line 52) | totalPages() {
method paginate (line 56) | paginate(link) {
method paginateNext (line 68) | paginateNext() {
method paginatePrev (line 82) | paginatePrev() {
method paginateTo (line 92) | paginateTo(object) {
method hideTopPage (line 105) | hideTopPage() {
method hideBottomPage (line 114) | hideBottomPage() {
method onClick (line 125) | onClick(event) {
FILE: assets/javascripts/views/misc/news.js
method init0 (line 8) | init0() {
method render (line 16) | render() {
method getUnreadNews (line 20) | getUnreadNews() {
method getLastNewsTime (line 36) | getLastNewsTime() {
method getLastReadTime (line 40) | getLastReadTime() {
method markAllAsRead (line 44) | markAllAsRead() {
FILE: assets/javascripts/views/misc/notice.js
method constructor (line 5) | constructor(type, ...args) {
method init0 (line 13) | init0() {
method activate (line 17) | activate() {
method deactivate (line 23) | deactivate() {
method show (line 29) | show() {
method hide (line 34) | hide() {
FILE: assets/javascripts/views/misc/notif.js
method constructor (line 10) | constructor(type, options) {
method init0 (line 18) | init0() {
method show (line 22) | show() {
method hide (line 39) | hide() {
method render (line 45) | render() {
method position (line 49) | position() {
method onClick (line 58) | onClick(event) {
FILE: assets/javascripts/views/misc/tip.js
method render (line 8) | render() {
FILE: assets/javascripts/views/misc/updates.js
method init0 (line 8) | init0() {
method render (line 18) | render() {
method getUpdatedDocs (line 24) | getUpdatedDocs() {
method getUpdatedDisabledDocs (line 33) | getUpdatedDisabledDocs() {
method getLastUpdateTime (line 49) | getLastUpdateTime() {
method markAllAsRead (line 53) | markAllAsRead() {
FILE: assets/javascripts/views/pages/base.js
method constructor (line 2) | constructor(el, entry) {
method deactivate (line 7) | deactivate() {
method render (line 13) | render(content, fromCache) {
method highlightCode (line 35) | highlightCode() {
method paintCode (line 43) | paintCode(timing) {
FILE: assets/javascripts/views/pages/hidden.js
method constructor (line 4) | constructor(el, entry) {
method init (line 9) | init() {
method onClick (line 15) | onClick(event) {
FILE: assets/javascripts/views/pages/jquery.js
method afterRender (line 6) | afterRender() {
method onIframeLoaded (line 17) | onIframeLoaded(event) {
method runExamples (line 22) | runExamples() {
method runExample (line 30) | runExample(el) {
method fixIframeSource (line 50) | fixIframeSource(source) {
FILE: assets/javascripts/views/pages/rdoc.js
method onClick (line 6) | onClick(event) {
FILE: assets/javascripts/views/pages/sqlite.js
method onClick (line 6) | onClick(event) {
FILE: assets/javascripts/views/pages/support_tables.js
method onClick (line 8) | onClick(event) {
FILE: assets/javascripts/views/search/search.js
method init (line 29) | init() {
method focus (line 44) | focus() {
method autoFocus (line 54) | autoFocus() {
method onWindowFocus (line 67) | onWindowFocus(event) {
method getScopeDoc (line 73) | getScopeDoc() {
method reset (line 79) | reset(force) {
method onReady (line 88) | onReady() {
method onInput (line 93) | onInput() {
method search (line 109) | search(url) {
method searchUrl (line 121) | searchUrl() {
method clear (line 138) | clear() {
method externalSearch (line 143) | externalSearch(url) {
method google (line 154) | google() {
method stackoverflow (line 158) | stackoverflow() {
method duckduckgo (line 162) | duckduckgo() {
method onResults (line 166) | onResults(results) {
method onEnd (line 174) | onEnd() {
method onClick (line 180) | onClick(event) {
method onSubmit (line 187) | onSubmit(event) {
method onScopeChange (line 191) | onScopeChange() {
method afterRoute (line 196) | afterRoute(name, context) {
method extractHashValue (line 209) | extractHashValue() {
method getHashValue (line 217) | getHashValue() {
FILE: assets/javascripts/views/search/search_scope.js
method init (line 19) | init() {
method getScope (line 29) | getScope() {
method isActive (line 33) | isActive() {
method name (line 37) | name() {
method search (line 41) | search(value, searchDisabled) {
method searchUrl (line 54) | searchUrl() {
method onResults (line 61) | onResults(results) {
method selectDoc (line 73) | selectDoc(doc) {
method redirectToDoc (line 91) | redirectToDoc(doc) {
method reset (line 97) | reset() {
method doScopeSearch (line 113) | doScopeSearch(event) {
method onClick (line 120) | onClick(event) {
method onKeydown (line 127) | onKeydown(event) {
method onTextInput (line 148) | onTextInput(event) {
method extractHashValue (line 157) | extractHashValue() {
method getHashValue (line 169) | getHashValue() {
method afterRoute (line 175) | afterRoute(name, context) {
FILE: assets/javascripts/views/sidebar/doc_list.js
method init (line 18) | init() {
method activate (line 28) | activate() {
method deactivate (line 38) | deactivate() {
method render (line 47) | render() {
method renderDisabled (line 60) | renderDisabled() {
method renderDisabledList (line 68) | renderDisabledList() {
method appendDisabledList (line 76) | appendDisabledList() {
method removeDisabledList (line 102) | removeDisabledList() {
method reset (line 110) | reset(options) {
method onOpen (line 124) | onOpen(event) {
method onClose (line 136) | onClose(event) {
method select (line 146) | select(model) {
method reveal (line 150) | reveal(model) {
method focus (line 160) | focus(model) {
method revealCurrent (line 166) | revealCurrent() {
method openDoc (line 174) | openDoc(doc) {
method closeDoc (line 183) | closeDoc(doc) {
method openType (line 187) | openType(type) {
method paginateTo (line 193) | paginateTo(model) {
method scrollTo (line 199) | scrollTo(model) {
method toggleDisabled (line 205) | toggleDisabled() {
method onClick (line 215) | onClick(event) {
method onEnabled (line 237) | onEnabled() {
method afterRoute (line 242) | afterRoute(route, context) {
FILE: assets/javascripts/views/sidebar/doc_picker.js
method init (line 9) | init() {
method activate (line 13) | activate() {
method deactivate (line 21) | deactivate() {
method render (line 29) | render() {
method renderVersions (line 56) | renderVersions(docs) {
method extractVersions (line 66) | extractVersions(originalDocs, version) {
method empty (line 75) | empty() {
method getSelectedDocs (line 80) | getSelectedDocs() {
method onMouseDown (line 86) | onMouseDown() {
method onMouseUp (line 90) | onMouseUp() {
method onDOMFocus (line 94) | onDOMFocus(event) {
FILE: assets/javascripts/views/sidebar/entry_list.js
method constructor (line 7) | constructor(entries) {
method init0 (line 14) | init0() {
method render (line 19) | render(entries) {
FILE: assets/javascripts/views/sidebar/results.js
method constructor (line 8) | constructor(sidebar, search) {
method deactivate (line 16) | deactivate() {
method init0 (line 22) | init0() {
method onResults (line 32) | onResults(entries, flags) {
method onNoResults (line 50) | onNoResults() {
method onClear (line 54) | onClear() {
method focusFirst (line 58) | focusFirst() {
method openFirst (line 64) | openFirst() {
method onDocEnabled (line 68) | onDocEnabled(doc) {
method afterRoute (line 73) | afterRoute(route, context) {
method onClick (line 81) | onClick(event) {
FILE: assets/javascripts/views/sidebar/sidebar.js
method init (line 17) | init() {
method hide (line 41) | hide() {
method display (line 45) | display() {
method resetDisplay (line 49) | resetDisplay(options) {
method resetHoverOnMouseMove (line 65) | resetHoverOnMouseMove() {
method resetHover (line 70) | resetHover() {
method showView (line 74) | showView(view) {
method render (line 90) | render() {
method showDocList (line 94) | showDocList() {
method showResults (line 98) | showResults() {
method reset (line 103) | reset() {
method onReady (line 110) | onReady() {
method onScopeChange (line 116) | onScopeChange(newDoc, previousDoc) {
method saveScrollPosition (line 127) | saveScrollPosition() {
method restoreScrollPosition (line 133) | restoreScrollPosition() {
method scrollToTop (line 142) | scrollToTop() {
method onSearching (line 146) | onSearching() {
method onSearchClear (line 150) | onSearchClear() {
method onFocus (line 155) | onFocus(event) {
method onSelect (line 162) | onSelect() {
method onClick (line 166) | onClick(event) {
method onAltR (line 176) | onAltR() {
method onEscape (line 182) | onEscape() {
method onDocEnabled (line 193) | onDocEnabled() {
method afterRoute (line 198) | afterRoute(name, context) {
FILE: assets/javascripts/views/sidebar/sidebar_hover.js
method show (line 15) | show(el) {
method hide (line 30) | hide() {
method position (line 37) | position() {
method makeClone (line 49) | makeClone(el) {
method isTarget (line 55) | isTarget(el) {
method isSelected (line 59) | isSelected(el) {
method isTruncated (line 63) | isTruncated(el) {
method onFocus (line 67) | onFocus(event) {
method onBlur (line 72) | onBlur() {
method onMouseover (line 76) | onMouseover(event) {
method onMouseout (line 86) | onMouseout(event) {
method mouseActivated (line 92) | mouseActivated() {
method onScroll (line 97) | onScroll() {
method onClick (line 101) | onClick(event) {
method onRoute (line 107) | onRoute() {
FILE: assets/javascripts/views/sidebar/type_list.js
method constructor (line 10) | constructor(doc) {
method init0 (line 17) | init0() {
method activate (line 23) | activate() {
method deactivate (line 32) | deactivate() {
method render (line 41) | render() {
method onOpen (line 49) | onOpen(event) {
method onClose (line 62) | onClose(event) {
method paginateTo (line 75) | paginateTo(model) {
FILE: assets/javascripts/views/view.js
method constructor (line 2) | constructor(el) {
method setupElement (line 21) | setupElement() {
method refreshElements (line 39) | refreshElements() {
method addClass (line 48) | addClass(name) {
method removeClass (line 52) | removeClass(name) {
method toggleClass (line 56) | toggleClass(name) {
method hasClass (line 60) | hasClass(name) {
method resetClass (line 64) | resetClass() {
method find (line 73) | find(selector) {
method findAll (line 77) | findAll(selector) {
method findByClass (line 81) | findByClass(name) {
method findLastByClass (line 85) | findLastByClass(name) {
method findAllByClass (line 90) | findAllByClass(name) {
method findByTag (line 94) | findByTag(tag) {
method findLastByTag (line 98) | findLastByTag(tag) {
method findAllByTag (line 103) | findAllByTag(tag) {
method append (line 107) | append(value) {
method appendTo (line 111) | appendTo(value) {
method prepend (line 115) | prepend(value) {
method prependTo (line 119) | prependTo(value) {
method before (line 123) | before(value) {
method after (line 127) | after(value) {
method remove (line 131) | remove(value) {
method empty (line 135) | empty() {
method html (line 140) | html(value) {
method tmpl (line 145) | tmpl(...args) {
method delay (line 149) | delay(fn, ...args) {
method onDOM (line 154) | onDOM(event, callback) {
method offDOM (line 158) | offDOM(event, callback) {
method bindEvents (line 162) | bindEvents() {
method unbindEvents (line 189) | unbindEvents() {
method addSubview (line 213) | addSubview(view) {
method activate (line 217) | activate() {
method deactivate (line 231) | deactivate() {
method detach (line 245) | detach() {
FILE: lib/app.rb
class App (line 6) | class App < Sinatra::Application
method parse_docs (line 110) | def self.parse_docs
method parse_news (line 119) | def self.parse_news
method memoized_cookies (line 137) | def memoized_cookies
method canonical_origin (line 141) | def canonical_origin
method browser (line 145) | def browser
method unsupported_browser? (line 149) | def unsupported_browser?
method docs (line 153) | def docs
method find_doc (line 165) | def find_doc(slug)
method user_has_docs? (line 174) | def user_has_docs?(slug)
method doc_index_urls (line 181) | def doc_index_urls
method doc_index_page? (line 189) | def doc_index_page?
method query_string_for_redirection (line 193) | def query_string_for_redirection
method service_worker_asset_urls (line 197) | def service_worker_asset_urls
method service_worker_cache_name (line 211) | def service_worker_cache_name
method redirect_via_js (line 235) | def redirect_via_js(path)
method supports_js_redirection? (line 240) | def supports_js_redirection?
method modern_browser? (line 248) | def modern_browser?(browser)
FILE: lib/docs.rb
type Docs (line 8) | module Docs
class DocNotFound (line 31) | class DocNotFound < NameError; end
class SetupError (line 32) | class SetupError < StandardError; end
function all (line 34) | def self.all
function all_versions (line 42) | def self.all_versions
function defaults (line 46) | def self.defaults
function installed (line 50) | def self.installed
function find (line 58) | def self.find(name, version = nil)
function find_by_slug (line 78) | def self.find_by_slug(slug, version = nil)
function generate_page (line 94) | def self.generate_page(name, version, page_id)
function generate (line 98) | def self.generate(doc, version = nil)
function generate_manifest (line 103) | def self.generate_manifest
function store (line 107) | def self.store
function aliases (line 111) | def self.aliases
function install_report (line 151) | def self.install_report(*names)
FILE: lib/docs/core/autoload_helper.rb
type Docs (line 1) | module Docs
type AutoloadHelper (line 2) | module AutoloadHelper
function autoload_all (line 3) | def autoload_all(path, suffix = '')
FILE: lib/docs/core/doc.rb
type Docs (line 1) | module Docs
class Doc (line 2) | class Doc
method inherited (line 12) | def inherited(subclass)
method version (line 16) | def version(version = nil, &block)
method version= (line 31) | def version=(value)
method versions (line 35) | def versions
method version? (line 39) | def version?
method versioned? (line 43) | def versioned?
method name (line 47) | def name
method slug (line 51) | def slug
method version_slug (line 56) | def version_slug
method path (line 65) | def path
method index_path (line 69) | def index_path
method db_path (line 73) | def db_path
method meta_path (line 77) | def meta_path
method as_json (line 81) | def as_json
method store_page (line 89) | def store_page(store, id)
method store_pages (line 110) | def store_pages(store)
method default_slug (line 138) | def default_slug
method store_page? (line 143) | def store_page?(page)
method store_index (line 147) | def store_index(store, filename, index, read_write=true)
method store_meta (line 154) | def store_meta(store)
method initialize (line 162) | def initialize
method build_page (line 166) | def build_page(id, &block)
method build_pages (line 170) | def build_pages(&block)
method get_scraper_version (line 174) | def get_scraper_version(opts)
method get_latest_version (line 190) | def get_latest_version(opts)
method outdated_state (line 205) | def outdated_state(scraper_version, latest_version)
method fetch (line 228) | def fetch(url, opts)
method fetch_doc (line 249) | def fetch_doc(url, opts)
method fetch_json (line 254) | def fetch_json(url, opts)
method get_npm_version (line 258) | def get_npm_version(package, opts, tag='latest')
method get_latest_github_release (line 263) | def get_latest_github_release(owner, repo, opts)
method get_github_tags (line 269) | def get_github_tags(owner, repo, opts)
method get_github_file_contents (line 273) | def get_github_file_contents(owner, repo, path, opts)
method get_latest_github_commit_date (line 278) | def get_latest_github_commit_date(owner, repo, opts)
method get_gitlab_tags (line 284) | def get_gitlab_tags(hostname, group, project, opts)
FILE: lib/docs/core/entry_index.rb
type Docs (line 3) | module Docs
class EntryIndex (line 4) | class EntryIndex
method initialize (line 7) | def initialize
method add (line 13) | def add(entry)
method empty? (line 21) | def empty?
method length (line 27) | def length
method as_json (line 31) | def as_json
method to_json (line 35) | def to_json
method add_entry (line 41) | def add_entry(entry)
method entries_as_json (line 48) | def entries_as_json
method types_as_json (line 52) | def types_as_json
method sort_fn (line 58) | def sort_fn(a, b)
FILE: lib/docs/core/filter.rb
type Docs (line 3) | module Docs
class Filter (line 4) | class Filter < ::HTML::Pipeline::Filter
method css (line 5) | def css(*args)
method at_css (line 9) | def at_css(*args)
method xpath (line 13) | def xpath(*args)
method at_xpath (line 17) | def at_xpath(*args)
method base_url (line 21) | def base_url
method links (line 25) | def links
method current_url (line 29) | def current_url
method root_url (line 33) | def root_url
method root_path (line 37) | def root_path
method version (line 41) | def version
method release (line 45) | def release
method subpath (line 49) | def subpath
method subpath_to (line 53) | def subpath_to(url)
method slug (line 57) | def slug
method root_page? (line 61) | def root_page?
method initial_page? (line 65) | def initial_page?
method fragment_url_string? (line 71) | def fragment_url_string?(str)
method data_url_string? (line 77) | def data_url_string?(str)
method relative_url_string? (line 81) | def relative_url_string?(str)
method absolute_url_string? (line 85) | def absolute_url_string?(str)
method parse_html (line 89) | def parse_html(html)
method clean_path (line 94) | def clean_path(path)
FILE: lib/docs/core/filter_stack.rb
type Docs (line 1) | module Docs
class FilterStack (line 2) | class FilterStack
method initialize (line 8) | def initialize(filters = nil)
method push (line 12) | def push(*names)
method insert (line 16) | def insert(index, *names)
method insert_after (line 22) | def insert_after(index, *names)
method replace (line 26) | def replace(index, name)
method == (line 30) | def ==(other)
method to_a (line 34) | def to_a
method inheritable_copy (line 38) | def inheritable_copy
method filter_const (line 44) | def filter_const(name)
method assert_index (line 52) | def assert_index(index)
FILE: lib/docs/core/instrumentable.rb
type Docs (line 3) | module Docs
type Instrumentable (line 4) | module Instrumentable
function extended (line 5) | def self.extended(base)
function included (line 9) | def self.included(base)
type Methods (line 13) | module Methods
function instrument (line 14) | def instrument(*args, &block)
function subscribe (line 18) | def subscribe(*args, &block)
FILE: lib/docs/core/manifest.rb
type Docs (line 3) | module Docs
class Manifest (line 4) | class Manifest
method initialize (line 7) | def initialize(store, docs)
method store (line 12) | def store
method as_json (line 16) | def as_json
method to_json (line 28) | def to_json
FILE: lib/docs/core/models/entry.rb
type Docs (line 3) | module Docs
class Entry (line 4) | class Entry
class Invalid (line 5) | class Invalid < StandardError; end
method initialize (line 9) | def initialize(name = nil, path = nil, type = nil)
method == (line 21) | def ==(other)
method name= (line 25) | def name=(value)
method type= (line 29) | def type=(value)
method root? (line 33) | def root?
method as_json (line 37) | def as_json
FILE: lib/docs/core/models/type.rb
type Docs (line 1) | module Docs
function initialize (line 5) | def initialize(*args)
function slug (line 10) | def slug
function as_json (line 14) | def as_json
FILE: lib/docs/core/page_db.rb
type Docs (line 3) | module Docs
class PageDb (line 4) | class PageDb
method initialize (line 9) | def initialize
method add (line 13) | def add(path, content)
method as_json (line 17) | def as_json
method to_json (line 21) | def to_json
FILE: lib/docs/core/parser.rb
type Docs (line 1) | module Docs
class Parser (line 2) | class Parser
method initialize (line 5) | def initialize(content)
method document? (line 14) | def document?
method parse_as_document (line 18) | def parse_as_document
method parse_as_fragment (line 24) | def parse_as_fragment
FILE: lib/docs/core/request.rb
type Docs (line 1) | module Docs
class Request (line 2) | class Request < Typhoeus::Request
method run (line 10) | def self.run(*args, &block)
method initialize (line 16) | def initialize(url, options = {})
method response= (line 20) | def response=(value)
method run (line 25) | def run
FILE: lib/docs/core/requester.rb
type Docs (line 1) | module Docs
class Requester (line 2) | class Requester < Typhoeus::Hydra
method run (line 7) | def self.run(urls, options = {}, &block)
method initialize (line 22) | def initialize(options = {})
method request (line 29) | def request(urls, options = {}, &block)
method queue (line 36) | def queue(request)
method on_response (line 41) | def on_response(&block)
method build_and_queue_request (line 49) | def build_and_queue_request(url, options = {}, &block)
method handle_response (line 56) | def handle_response(response)
FILE: lib/docs/core/response.rb
type Docs (line 1) | module Docs
type Response (line 2) | module Response
function success? (line 3) | def success?
function error? (line 7) | def error?
function blank? (line 11) | def blank?
function content_length (line 15) | def content_length
function mime_type (line 20) | def mime_type
function html? (line 24) | def html?
function url (line 28) | def url
function path (line 32) | def path
function effective_url (line 36) | def effective_url
function effective_path (line 40) | def effective_path
FILE: lib/docs/core/scraper.rb
type Docs (line 3) | module Docs
class Scraper (line 4) | class Scraper < Doc
method inherited (line 8) | def inherited(subclass)
method filters (line 25) | def filters
method stub (line 29) | def stub(path, &block)
method initialize (line 48) | def initialize
method initialize_stubs (line 53) | def initialize_stubs
method build_page (line 65) | def build_page(path)
method build_pages (line 72) | def build_pages
method base_url (line 86) | def base_url
method root_url (line 90) | def root_url
method root_path (line 94) | def root_path
method root_path? (line 98) | def root_path?
method initial_paths (line 102) | def initial_paths
method initial_urls (line 106) | def initial_urls
method pipeline (line 110) | def pipeline
method options (line 116) | def options
method request_one (line 137) | def request_one(url)
method request_all (line 141) | def request_all(url, &block)
method process_response? (line 145) | def process_response?(response)
method url_for (line 149) | def url_for(path)
method handle_response (line 157) | def handle_response(response)
method process_response (line 174) | def process_response(response)
method pipeline_context (line 183) | def pipeline_context(response)
method parse (line 187) | def parse(response)
method with_filters (line 192) | def with_filters(*filters)
method additional_options (line 201) | def additional_options
type FixInternalUrlsBehavior (line 205) | module FixInternalUrlsBehavior
function included (line 206) | def self.included(base)
function prepended (line 210) | def self.prepended(base)
type ClassMethods (line 216) | module ClassMethods
function internal_urls (line 217) | def internal_urls
function store_pages (line 221) | def store_pages(store)
function with_internal_urls (line 231) | def with_internal_urls
function fetch_internal_urls (line 239) | def fetch_internal_urls
function initial_urls (line 247) | def initial_urls
function additional_options (line 254) | def additional_options
function process_response (line 268) | def process_response(response)
FILE: lib/docs/core/scrapers/file_scraper.rb
type Docs (line 1) | module Docs
class FileScraper (line 2) | class FileScraper < Scraper
method inherited (line 8) | def inherited(subclass)
method source_directory (line 18) | def source_directory
method assert_source_directory_exists (line 24) | def assert_source_directory_exists
method request_one (line 30) | def request_one(url)
method request_all (line 35) | def request_all(urls)
method process_response? (line 44) | def process_response?(response)
method url_to_path (line 48) | def url_to_path(url)
method read_file (line 52) | def read_file(path)
FILE: lib/docs/core/scrapers/url_scraper.rb
type Docs (line 1) | module Docs
class UrlScraper (line 2) | class UrlScraper < Scraper
method inherited (line 8) | def inherited(subclass)
method request_one (line 24) | def request_one(url)
method request_all (line 28) | def request_all(urls, &block)
method request_options (line 41) | def request_options
method process_response? (line 47) | def process_response?(response)
method process_url? (line 61) | def process_url?(url)
method load_capybara_selenium (line 65) | def load_capybara_selenium
type MultipleBaseUrls (line 78) | module MultipleBaseUrls
function included (line 79) | def self.included(base)
type ClassMethods (line 83) | module ClassMethods
function base_urls= (line 86) | def base_urls=(urls)
function initial_urls (line 92) | def initial_urls
function base_urls (line 96) | def base_urls
function process_url? (line 102) | def process_url?(url)
function process_response (line 106) | def process_response(response)
type FixRedirectionsBehavior (line 124) | module FixRedirectionsBehavior
function included (line 125) | def self.included(base)
function prepended (line 129) | def self.prepended(base)
type ClassMethods (line 135) | module ClassMethods
function redirections (line 136) | def redirections
function store_pages (line 140) | def store_pages(store)
function with_redirections (line 150) | def with_redirections
function fetch_redirections (line 158) | def fetch_redirections
function process_response (line 171) | def process_response(response)
function additional_options (line 175) | def additional_options
class RateLimiter (line 180) | class RateLimiter
method initialize (line 183) | def initialize(limit)
method call (line 189) | def call(*)
method to_proc (line 205) | def to_proc
FILE: lib/docs/core/subscriber.rb
type Docs (line 5) | module Docs
class Subscriber (line 6) | class Subscriber < ActiveSupport::Subscriber
method subscribe_to (line 9) | def self.subscribe_to(notifier)
method log (line 17) | def log(msg)
method format_url (line 21) | def format_url(url)
method format_path (line 25) | def format_path(path)
method justify (line 29) | def justify(str)
method terminal_width (line 42) | def terminal_width
FILE: lib/docs/core/url.rb
type Docs (line 4) | module Docs
class URL (line 5) | class URL < URI::Generic
method initialize (line 8) | def initialize(*args)
method parse (line 19) | def self.parse(url)
method join (line 24) | def self.join(*args)
method join (line 28) | def join(*args)
method merge! (line 32) | def merge!(hash)
method merge (line 41) | def merge(hash)
method origin (line 46) | def origin
method normalized_path (line 57) | def normalized_path
method subpath_to (line 61) | def subpath_to(url, options = nil)
method subpath_from (line 80) | def subpath_from(url, options = nil)
method contains? (line 84) | def contains?(url, options = nil)
method relative_path_to (line 88) | def relative_path_to(url)
method relative_path_from (line 107) | def relative_path_from(url)
FILE: lib/docs/filters/angular/clean_html.rb
type Docs (line 1) | module Docs
class Angular (line 2) | class Angular
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/angular/clean_html_v18.rb
type Docs (line 1) | module Docs
class Angular (line 2) | class Angular
class CleanHtmlV18Filter (line 3) | class CleanHtmlV18Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/angular/clean_html_v2.rb
type Docs (line 1) | module Docs
class Angular (line 2) | class Angular
class CleanHtmlV2Filter (line 3) | class CleanHtmlV2Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/angular/entries.rb
type Docs (line 1) | module Docs
class Angular (line 2) | class Angular
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
FILE: lib/docs/filters/angular/entries_v2.rb
type Docs (line 1) | module Docs
class Angular (line 2) | class Angular
class EntriesV2Filter (line 3) | class EntriesV2Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 29) | def get_type
method include_default_entry? (line 46) | def include_default_entry?
method mod (line 52) | def mod
FILE: lib/docs/filters/angularjs/clean_html.rb
type Docs (line 1) | module Docs
class Angularjs (line 2) | class Angularjs
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 21) | def root
method other (line 36) | def other
FILE: lib/docs/filters/angularjs/clean_urls.rb
type Docs (line 1) | module Docs
class Angularjs (line 2) | class Angularjs
class CleanUrlsFilter (line 3) | class CleanUrlsFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/angularjs/entries.rb
type Docs (line 1) | module Docs
class Angularjs (line 2) | class Angularjs
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 18) | def get_type
method subtype (line 28) | def subtype
method additional_entries (line 35) | def additional_entries
FILE: lib/docs/filters/ansible/clean_html.rb
type Docs (line 1) | module Docs
class Ansible (line 2) | class Ansible
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/ansible/entries.rb
type Docs (line 1) | module Docs
class Ansible (line 2) | class Ansible
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 21) | def get_type
FILE: lib/docs/filters/apache/clean_html.rb
type Docs (line 1) | module Docs
class Apache (line 2) | class Apache
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/apache/entries.rb
type Docs (line 1) | module Docs
class Apache (line 2) | class Apache
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 24) | def get_type
method additional_entries (line 46) | def additional_entries
FILE: lib/docs/filters/apache_pig/clean_html.rb
type Docs (line 1) | module Docs
class ApachePig (line 2) | class ApachePig
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/apache_pig/entries.rb
type Docs (line 1) | module Docs
class ApachePig (line 2) | class ApachePig
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/astro/clean_html.rb
type Docs (line 1) | module Docs
class Astro (line 2) | class Astro
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/astro/entries.rb
type Docs (line 1) | module Docs
class Astro (line 2) | class Astro
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 17) | def additional_entries
FILE: lib/docs/filters/async/clean_html.rb
type Docs (line 1) | module Docs
class Async (line 2) | class Async
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/async/entries.rb
type Docs (line 1) | module Docs
class Async (line 2) | class Async
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/axios/clean_html.rb
type Docs (line 1) | module Docs
class Axios (line 2) | class Axios
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/axios/entries.rb
type Docs (line 1) | module Docs
class Axios (line 2) | class Axios
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
FILE: lib/docs/filters/babel/clean_html.rb
type Docs (line 1) | module Docs
class Babel (line 2) | class Babel
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/babel/entries.rb
type Docs (line 1) | module Docs
class Babel (line 2) | class Babel
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 15) | def get_name
method get_type (line 19) | def get_type
FILE: lib/docs/filters/backbone/clean_html.rb
type Docs (line 1) | module Docs
class Backbone (line 2) | class Backbone
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/backbone/entries.rb
type Docs (line 1) | module Docs
class Backbone (line 2) | class Backbone
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/bash/clean_html.rb
type Docs (line 1) | module Docs
class Bash (line 2) | class Bash
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/bash/entries.rb
type Docs (line 1) | module Docs
class Bash (line 2) | class Bash
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 22) | def get_type
method additional_entries (line 28) | def additional_entries
FILE: lib/docs/filters/bazel/clean_html.rb
type Docs (line 1) | module Docs
class Bazel (line 2) | class Bazel
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/bazel/entries.rb
type Docs (line 1) | module Docs
class Bazel (line 2) | class Bazel
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 13) | def additional_entries
FILE: lib/docs/filters/bluebird/clean_html.rb
type Docs (line 1) | module Docs
class Bluebird (line 2) | class Bluebird
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/bluebird/entries.rb
type Docs (line 1) | module Docs
class Bluebird (line 2) | class Bluebird
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 31) | def get_name
method get_type (line 37) | def get_type
FILE: lib/docs/filters/bootstrap/clean_html_v3.rb
type Docs (line 1) | module Docs
class Bootstrap (line 2) | class Bootstrap
class CleanHtmlV3Filter (line 3) | class CleanHtmlV3Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/bootstrap/clean_html_v4.rb
type Docs (line 1) | module Docs
class Bootstrap (line 2) | class Bootstrap
class CleanHtmlV4Filter (line 3) | class CleanHtmlV4Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/bootstrap/clean_html_v5.rb
type Docs (line 1) | module Docs
class Bootstrap (line 2) | class Bootstrap
class CleanHtmlV5Filter (line 3) | class CleanHtmlV5Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/bootstrap/entries_v3.rb
type Docs (line 1) | module Docs
class Bootstrap (line 2) | class Bootstrap
class EntriesV3Filter (line 3) | class EntriesV3Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/bootstrap/entries_v4.rb
type Docs (line 1) | module Docs
class Bootstrap (line 2) | class Bootstrap
class EntriesV4Filter (line 3) | class EntriesV4Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 18) | def additional_entries
FILE: lib/docs/filters/bootstrap/entries_v5.rb
type Docs (line 1) | module Docs
class Bootstrap (line 2) | class Bootstrap
class EntriesV5Filter (line 3) | class EntriesV5Filter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 17) | def additional_entries
FILE: lib/docs/filters/bottle/entries.rb
type Docs (line 1) | module Docs
class Bottle (line 2) | class Bottle
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 25) | def additional_entries
FILE: lib/docs/filters/bower/clean_html.rb
type Docs (line 1) | module Docs
class Bower (line 2) | class Bower
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/bower/entries.rb
type Docs (line 1) | module Docs
class Bower (line 2) | class Bower
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 8) | def get_name
method get_type (line 12) | def get_type
method additional_entries (line 16) | def additional_entries
FILE: lib/docs/filters/bun/clean_html.rb
type Docs (line 1) | module Docs
class Bun (line 2) | class Bun
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/bun/entries.rb
type Docs (line 1) | module Docs
class Bun (line 2) | class Bun
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 13) | def additional_entries
FILE: lib/docs/filters/c/entries.rb
type Docs (line 1) | module Docs
class C (line 2) | class C
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 16) | def get_name
method get_type (line 24) | def get_type
method additional_entries (line 35) | def additional_entries
FILE: lib/docs/filters/cakephp/clean_html.rb
type Docs (line 1) | module Docs
class Cakephp (line 2) | class Cakephp
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/cakephp/clean_html_39_plus.rb
type Docs (line 1) | module Docs
class Cakephp (line 2) | class Cakephp
class CleanHtml39PlusFilter (line 3) | class CleanHtml39PlusFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/cakephp/entries.rb
type Docs (line 1) | module Docs
class Cakephp (line 2) | class Cakephp
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method page_type (line 4) | def page_type
method slug_without_page_type (line 8) | def slug_without_page_type
method get_name (line 12) | def get_name
method get_type (line 25) | def get_type
method additional_entries (line 43) | def additional_entries
FILE: lib/docs/filters/cakephp/entries_39_plus.rb
type Docs (line 1) | module Docs
class Cakephp (line 2) | class Cakephp
class Entries39PlusFilter (line 3) | class Entries39PlusFilter < Docs::EntriesFilter
method page_type (line 4) | def page_type
method slug_without_page_type (line 8) | def slug_without_page_type
method get_name (line 12) | def get_name
method get_type (line 23) | def get_type
method additional_entries (line 32) | def additional_entries
FILE: lib/docs/filters/chai/clean_html.rb
type Docs (line 1) | module Docs
class Chai (line 2) | class Chai
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/chai/entries.rb
type Docs (line 1) | module Docs
class Chai (line 2) | class Chai
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/chef/clean_html.rb
type Docs (line 1) | module Docs
class Chef (line 2) | class Chef
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/chef/clean_html_old.rb
type Docs (line 1) | module Docs
class Chef (line 2) | class Chef
class CleanHtmlOldFilter (line 3) | class CleanHtmlOldFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/chef/entries.rb
type Docs (line 1) | module Docs
class Chef (line 2) | class Chef
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
FILE: lib/docs/filters/chef/entries_old.rb
type Docs (line 1) | module Docs
class Chef (line 2) | class Chef
class EntriesOldFilter (line 3) | class EntriesOldFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 31) | def get_type
method server_page? (line 52) | def server_page?
method nav_path (line 56) | def nav_path
FILE: lib/docs/filters/chefclient/clean_html.rb
type Docs (line 1) | module Docs
class Chefclient (line 2) | class Chefclient
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/chefclient/entries.rb
type Docs (line 1) | module Docs
class Chefclient (line 2) | class Chefclient
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 27) | def get_name
method get_type (line 42) | def get_type
FILE: lib/docs/filters/click/entries.rb
type Docs (line 1) | module Docs
class Click (line 2) | class Click
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 6) | def call
method get_name (line 20) | def get_name
method get_type (line 24) | def get_type
method include_default_entry? (line 28) | def include_default_entry?
method additional_entries (line 32) | def additional_entries
FILE: lib/docs/filters/click/pre_clean_html.rb
type Docs (line 1) | module Docs
class Click (line 2) | class Click
class PreCleanHtmlFilter (line 3) | class PreCleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/clojure/clean_html.rb
type Docs (line 1) | module Docs
class Clojure (line 2) | class Clojure
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/clojure/entries.rb
type Docs (line 1) | module Docs
class Clojure (line 2) | class Clojure
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/cmake/clean_html.rb
type Docs (line 1) | module Docs
class Cmake (line 2) | class Cmake
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/cmake/entries.rb
type Docs (line 1) | module Docs
class Cmake (line 2) | class Cmake
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 27) | def get_name
method get_type (line 39) | def get_type
FILE: lib/docs/filters/codeception/clean_html.rb
type Docs (line 1) | module Docs
class Codeception (line 2) | class Codeception
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/codeception/entries.rb
type Docs (line 1) | module Docs
class Codeception (line 2) | class Codeception
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 14) | def get_type
method additional_entries (line 26) | def additional_entries
FILE: lib/docs/filters/codeceptjs/clean_html.rb
type Docs (line 1) | module Docs
class Codeceptjs (line 2) | class Codeceptjs
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/codeceptjs/entries.rb
type Docs (line 1) | module Docs
class Codeceptjs (line 2) | class Codeceptjs
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 20) | def additional_entries
FILE: lib/docs/filters/codeigniter/entries.rb
type Docs (line 1) | module Docs
class Codeigniter (line 2) | class Codeigniter
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 22) | def additional_entries
FILE: lib/docs/filters/coffeescript/clean_html.rb
type Docs (line 1) | module Docs
class Coffeescript (line 2) | class Coffeescript
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/coffeescript/clean_html_v1.rb
type Docs (line 1) | module Docs
class Coffeescript (line 2) | class Coffeescript
class CleanHtmlV1Filter (line 3) | class CleanHtmlV1Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/coffeescript/entries.rb
type Docs (line 1) | module Docs
class Coffeescript (line 2) | class Coffeescript
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 41) | def additional_entries
method name_to_id (line 74) | def name_to_id(name)
FILE: lib/docs/filters/coffeescript/entries_v1.rb
type Docs (line 1) | module Docs
class Coffeescript (line 2) | class Coffeescript
class EntriesV1Filter (line 3) | class EntriesV1Filter < Docs::EntriesFilter
method additional_entries (line 58) | def additional_entries
method name_to_id (line 75) | def name_to_id(name)
FILE: lib/docs/filters/composer/clean_html.rb
type Docs (line 1) | module Docs
class Composer (line 2) | class Composer
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/composer/entries.rb
type Docs (line 1) | module Docs
class Composer (line 2) | class Composer
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 15) | def additional_entries
FILE: lib/docs/filters/cordova/clean_html.rb
type Docs (line 1) | module Docs
class Cordova (line 2) | class Cordova
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/cordova/clean_html_core.rb
type Docs (line 1) | module Docs
class Cordova (line 2) | class Cordova
class CleanHtmlCoreFilter (line 3) | class CleanHtmlCoreFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/cordova/entries.rb
type Docs (line 1) | module Docs
class Cordova (line 2) | class Cordova
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 11) | def get_type
method additional_entries (line 17) | def additional_entries
FILE: lib/docs/filters/core/apply_base_url.rb
type Docs (line 1) | module Docs
class ApplyBaseUrlFilter (line 2) | class ApplyBaseUrlFilter < Filter
method call (line 6) | def call
FILE: lib/docs/filters/core/attribution.rb
type Docs (line 3) | module Docs
class AttributionFilter (line 4) | class AttributionFilter < Filter
method call (line 5) | def call
method attribution (line 10) | def attribution
method attribution_html (line 18) | def attribution_html
method attribution_link (line 29) | def attribution_link
FILE: lib/docs/filters/core/clean_html.rb
type Docs (line 3) | module Docs
class CleanHtmlFilter (line 4) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/core/clean_local_urls.rb
type Docs (line 3) | module Docs
class CleanLocalUrlsFilter (line 4) | class CleanLocalUrlsFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/core/clean_text.rb
type Docs (line 3) | module Docs
class CleanTextFilter (line 4) | class CleanTextFilter < Filter
method call (line 7) | def call
FILE: lib/docs/filters/core/container.rb
type Docs (line 3) | module Docs
class ContainerFilter (line 4) | class ContainerFilter < Filter
class ContainerNotFound (line 5) | class ContainerNotFound < StandardError; end
method call (line 7) | def call
FILE: lib/docs/filters/core/entries.rb
type Docs (line 3) | module Docs
class EntriesFilter (line 4) | class EntriesFilter < Filter
method call (line 5) | def call
method entries (line 10) | def entries
method include_default_entry? (line 17) | def include_default_entry?
method default_entry (line 21) | def default_entry
method additional_entries (line 25) | def additional_entries
method name (line 29) | def name
method get_name (line 34) | def get_name
method type (line 38) | def type
method get_type (line 43) | def get_type
method path (line 47) | def path
method build_entries (line 51) | def build_entries(entries)
method build_entry (line 57) | def build_entry(name, frag = nil, type = nil)
FILE: lib/docs/filters/core/images.rb
type Docs (line 6) | module Docs
class ImagesFilter (line 7) | class ImagesFilter < Filter
method optimize_image_data (line 12) | def self.optimize_image_data(data)
method cache (line 17) | def self.cache
method call (line 21) | def call
FILE: lib/docs/filters/core/inner_html.rb
type Docs (line 3) | module Docs
class InnerHtmlFilter (line 4) | class InnerHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/core/internal_urls.rb
type Docs (line 3) | module Docs
class InternalUrlsFilter (line 4) | class InternalUrlsFilter < Filter
method call (line 5) | def call
method update_links (line 15) | def update_links
method update_and_follow_links (line 24) | def update_and_follow_links
method skip_links? (line 32) | def skip_links?
method follow_links? (line 38) | def follow_links?
method to_internal_url (line 44) | def to_internal_url(str)
method parse_url (line 52) | def parse_url(str)
method normalize_subpath (line 58) | def normalize_subpath(path)
method skip_subpath? (line 67) | def skip_subpath?(path)
method normalize_url (line 81) | def normalize_url(url, subpath)
method internal_path_to (line 86) | def internal_path_to(url)
method index_url (line 93) | def index_url
method effective_url (line 97) | def effective_url
FILE: lib/docs/filters/core/normalize_paths.rb
type Docs (line 3) | module Docs
class NormalizePathsFilter (line 4) | class NormalizePathsFilter < Filter
method call (line 5) | def call
method path (line 20) | def path
method store_path (line 24) | def store_path
method normalized_subpath (line 28) | def normalized_subpath
method normalize_href (line 32) | def normalize_href(href)
method normalize_path (line 40) | def normalize_path(path)
FILE: lib/docs/filters/core/normalize_urls.rb
type Docs (line 3) | module Docs
class NormalizeUrlsFilter (line 4) | class NormalizeUrlsFilter < Filter
method call (line 7) | def call
method update_attribute (line 14) | def update_attribute(tag, attribute)
method normalize_url (line 22) | def normalize_url(str)
method to_absolute_url (line 37) | def to_absolute_url(str)
method fix_url (line 42) | def fix_url(url)
FILE: lib/docs/filters/core/parse_cf_email.rb
type Docs (line 3) | module Docs
class ParseCfEmailFilter (line 4) | class ParseCfEmailFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/core/title.rb
type Docs (line 3) | module Docs
class TitleFilter (line 4) | class TitleFilter < Filter
method call (line 5) | def call
method title (line 11) | def title
method default_title (line 21) | def default_title
method node (line 25) | def node(content)
FILE: lib/docs/filters/couchdb/clean_html.rb
type Docs (line 1) | module Docs
class Couchdb (line 2) | class Couchdb
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/couchdb/entries.rb
type Docs (line 1) | module Docs
class Couchdb (line 2) | class Couchdb
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 13) | def get_name
method get_type (line 17) | def get_type
method additional_entries (line 27) | def additional_entries
FILE: lib/docs/filters/cpp/entries.rb
type Docs (line 1) | module Docs
class Cpp (line 2) | class Cpp
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 13) | def get_name
method get_type (line 20) | def get_type
method additional_entries (line 39) | def additional_entries
method format_name (line 48) | def format_name(name)
method entries (line 71) | def entries
FILE: lib/docs/filters/cppref/clean_html.rb
type Docs (line 1) | module Docs
class Cppref (line 2) | class Cppref
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/cppref/fix_code.rb
type Docs (line 1) | module Docs
class Cppref (line 2) | class Cppref
class FixCodeFilter (line 3) | class FixCodeFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/crystal/clean_html.rb
type Docs (line 1) | module Docs
class Crystal (line 2) | class Crystal
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method book (line 9) | def book
method api (line 21) | def api
FILE: lib/docs/filters/crystal/entries.rb
type Docs (line 1) | module Docs
class Crystal (line 2) | class Crystal
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 29) | def get_type
method additional_entries (line 51) | def additional_entries
FILE: lib/docs/filters/css/clean_html.rb
type Docs (line 1) | module Docs
class Css (line 2) | class Css
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 14) | def other
FILE: lib/docs/filters/css/entries.rb
type Docs (line 1) | module Docs
class Css (line 2) | class Css
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 33) | def get_name
method get_type (line 47) | def get_type
method get_spec (line 93) | def get_spec
method additional_entries (line 137) | def additional_entries
method include_default_entry? (line 141) | def include_default_entry?
FILE: lib/docs/filters/cypress/clean_html.rb
type Docs (line 3) | module Docs
class Cypress (line 4) | class Cypress
class CleanHtmlFilter (line 5) | class CleanHtmlFilter < Filter
method call (line 6) | def call
FILE: lib/docs/filters/cypress/entries.rb
type Docs (line 3) | module Docs
class Cypress (line 4) | class Cypress
class EntriesFilter (line 5) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 19) | def get_name
method get_type (line 23) | def get_type
FILE: lib/docs/filters/d/clean_html.rb
type Docs (line 1) | module Docs
class D (line 2) | class D
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/d/entries.rb
type Docs (line 1) | module Docs
class D (line 2) | class D
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 15) | def get_type
method additional_entries (line 29) | def additional_entries
FILE: lib/docs/filters/d3/clean_html.rb
type Docs (line 1) | module Docs
class D3 (line 2) | class D3
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/d3/entries_v3.rb
type Docs (line 1) | module Docs
class D3 (line 2) | class D3
class EntriesV3Filter (line 3) | class EntriesV3Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/d3/entries_v4.rb
type Docs (line 1) | module Docs
class D3 (line 2) | class D3
class EntriesV4Filter (line 3) | class EntriesV4Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 18) | def additional_entries
FILE: lib/docs/filters/dart/clean_html.rb
type Docs (line 1) | module Docs
class Dart (line 2) | class Dart
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/dart/entries.rb
type Docs (line 1) | module Docs
class Dart (line 2) | class Dart
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 37) | def get_type
FILE: lib/docs/filters/deno/clean_html.rb
type Docs (line 1) | module Docs
class Deno (line 2) | class Deno
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/deno/entries.rb
type Docs (line 1) | module Docs
class Deno (line 2) | class Deno
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 13) | def get_type
FILE: lib/docs/filters/django/clean_html.rb
type Docs (line 1) | module Docs
class Django (line 2) | class Django
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/django/entries.rb
type Docs (line 1) | module Docs
class Django (line 2) | class Django
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 21) | def additional_entries
FILE: lib/docs/filters/django/fix_urls.rb
type Docs (line 1) | module Docs
class Django (line 2) | class Django
class FixUrlsFilter (line 3) | class FixUrlsFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/django_rest_framework/clean_html.rb
type Docs (line 1) | module Docs
class DjangoRestFramework (line 2) | class DjangoRestFramework
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Docs::Filter
method call (line 4) | def call
FILE: lib/docs/filters/django_rest_framework/entries.rb
type Docs (line 1) | module Docs
class DjangoRestFramework (line 2) | class DjangoRestFramework
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 11) | def get_type
method additional_entries (line 20) | def additional_entries
FILE: lib/docs/filters/docker/clean_html.rb
type Docs (line 1) | module Docs
class Docker (line 2) | class Docker
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/docker/entries.rb
type Docs (line 1) | module Docs
class Docker (line 2) | class Docker
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 11) | def get_name
method get_type (line 16) | def get_type
method product (line 27) | def product
FILE: lib/docs/filters/dojo/clean_html.rb
type Docs (line 1) | module Docs
class Dojo (line 2) | class Dojo
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/dojo/clean_urls.rb
type Docs (line 1) | module Docs
class Dojo (line 2) | class Dojo
class CleanUrlsFilter (line 3) | class CleanUrlsFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/dojo/entries.rb
type Docs (line 1) | module Docs
class Dojo (line 2) | class Dojo
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 13) | def additional_entries
FILE: lib/docs/filters/dom/clean_html.rb
type Docs (line 1) | module Docs
class Dom (line 2) | class Dom
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 12) | def other
FILE: lib/docs/filters/dom/entries.rb
type Docs (line 1) | module Docs
class Dom (line 2) | class Dom
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 196) | def get_name
method get_type (line 210) | def get_type
method include_default_entry? (line 250) | def include_default_entry?
method additional_entries (line 259) | def additional_entries
FILE: lib/docs/filters/drupal/clean_html.rb
type Docs (line 1) | module Docs
class Drupal (line 2) | class Drupal
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 13) | def other
FILE: lib/docs/filters/drupal/entries.rb
type Docs (line 1) | module Docs
class Drupal (line 2) | class Drupal
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method include_default_entry? (line 27) | def include_default_entry?
FILE: lib/docs/filters/drupal/internal_urls.rb
type Docs (line 1) | module Docs
class Drupal (line 2) | class Drupal
class InternalUrlsFilter (line 3) | class InternalUrlsFilter < Docs::InternalUrlsFilter
method internal_path_to (line 4) | def internal_path_to(url)
FILE: lib/docs/filters/drupal/normalize_paths.rb
type Docs (line 1) | module Docs
class Drupal (line 2) | class Drupal
class NormalizePathsFilter (line 3) | class NormalizePathsFilter < Docs::NormalizePathsFilter
method store_path (line 5) | def store_path
FILE: lib/docs/filters/duckdb/attribution.rb
type Docs (line 3) | module Docs
class Duckdb (line 4) | class Duckdb
class AttributionFilter (line 5) | class AttributionFilter < Docs::AttributionFilter
method attribution_link (line 6) | def attribution_link
FILE: lib/docs/filters/duckdb/clean_html.rb
type Docs (line 1) | module Docs
class Duckdb (line 2) | class Duckdb
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/duckdb/entries.rb
type Docs (line 1) | module Docs
class Duckdb (line 2) | class Duckdb
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 33) | def additional_entries
FILE: lib/docs/filters/eigen3/clean_html.rb
type Docs (line 1) | module Docs
class Eigen3 (line 2) | class Eigen3
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/eigen3/entries.rb
type Docs (line 1) | module Docs
class Eigen3 (line 2) | class Eigen3
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_type (line 4) | def get_type
method get_name (line 36) | def get_name
method get_title (line 40) | def get_title
method additional_entries (line 54) | def additional_entries
FILE: lib/docs/filters/electron/clean_html.rb
type Docs (line 1) | module Docs
class Electron (line 2) | class Electron
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/electron/entries.rb
type Docs (line 1) | module Docs
class Electron (line 2) | class Electron
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 16) | def get_type
method additional_entries (line 32) | def additional_entries
FILE: lib/docs/filters/elisp/clean_html.rb
type Docs (line 1) | module Docs
class Elisp (line 2) | class Elisp
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/elisp/entries.rb
type Docs (line 1) | module Docs
class Elisp (line 2) | class Elisp
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 24) | def get_type
method additional_entries (line 28) | def additional_entries
FILE: lib/docs/filters/elixir/clean_html.rb
type Docs (line 1) | module Docs
class Elixir (line 2) | class Elixir
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method api (line 9) | def api
FILE: lib/docs/filters/elixir/entries.rb
type Docs (line 1) | module Docs
class Elixir (line 2) | class Elixir
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 33) | def additional_entries
method include_default_entry? (line 59) | def include_default_entry?
FILE: lib/docs/filters/ember/clean_html.rb
type Docs (line 1) | module Docs
class Ember (line 2) | class Ember
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method api (line 12) | def api
method guide (line 74) | def guide
FILE: lib/docs/filters/ember/entries.rb
type Docs (line 1) | module Docs
class Ember (line 2) | class Ember
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 17) | def get_type
method include_default_entry? (line 34) | def include_default_entry?
method additional_entries (line 40) | def additional_entries
FILE: lib/docs/filters/enzyme/clean_html.rb
type Docs (line 1) | module Docs
class Enzyme (line 2) | class Enzyme
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/enzyme/entries.rb
type Docs (line 1) | module Docs
class Enzyme (line 2) | class Enzyme
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 20) | def get_type
FILE: lib/docs/filters/erlang/clean_html.rb
type Docs (line 1) | module Docs
class Erlang (line 2) | class Erlang
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/erlang/entries.rb
type Docs (line 1) | module Docs
class Erlang (line 2) | class Erlang
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 11) | def get_type
method include_default_entry? (line 37) | def include_default_entry?
method additional_entries (line 41) | def additional_entries
method entry_nodes (line 67) | def entry_nodes
FILE: lib/docs/filters/erlang/pre_clean_html.rb
type Docs (line 1) | module Docs
class Erlang (line 2) | class Erlang
class PreCleanHtmlFilter (line 3) | class PreCleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/esbuild/clean_html.rb
type Docs (line 1) | module Docs
class Esbuild (line 2) | class Esbuild
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/esbuild/entries.rb
type Docs (line 1) | module Docs
class Esbuild (line 2) | class Esbuild
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method name (line 4) | def name
method type (line 7) | def type
method additional_entries (line 11) | def additional_entries
FILE: lib/docs/filters/eslint/clean_html.rb
type Docs (line 1) | module Docs
class Eslint (line 2) | class Eslint
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/eslint/entries.rb
type Docs (line 1) | module Docs
class Eslint (line 2) | class Eslint
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 9) | def get_type
FILE: lib/docs/filters/express/clean_html.rb
type Docs (line 1) | module Docs
class Express (line 2) | class Express
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/express/entries.rb
type Docs (line 1) | module Docs
class Express (line 2) | class Express
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 10) | def get_name
method get_type (line 17) | def get_type
method additional_entries (line 21) | def additional_entries
FILE: lib/docs/filters/falcon/entries.rb
type Docs (line 1) | module Docs
class Falcon (line 2) | class Falcon
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 21) | def additional_entries
FILE: lib/docs/filters/fastapi/clean_html.rb
type Docs (line 1) | module Docs
class Fastapi (line 2) | class Fastapi
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/fastapi/container.rb
type Docs (line 1) | module Docs
class Fastapi (line 2) | class Fastapi
class ContainerFilter (line 3) | class ContainerFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/fastapi/entries.rb
type Docs (line 1) | module Docs
class Fastapi (line 2) | class Fastapi
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method sanitized_path (line 5) | def sanitized_path
method path_parts (line 9) | def path_parts
method get_name (line 13) | def get_name
method get_type (line 17) | def get_type
method additional_entries (line 25) | def additional_entries
FILE: lib/docs/filters/fish/clean_html_custom.rb
type Docs (line 1) | module Docs
class Fish (line 2) | class Fish
class CleanHtmlCustomFilter (line 3) | class CleanHtmlCustomFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/fish/clean_html_sphinx.rb
type Docs (line 1) | module Docs
class Fish (line 2) | class Fish
class CleanHtmlSphinxFilter (line 3) | class CleanHtmlSphinxFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/fish/entries_custom.rb
type Docs (line 1) | module Docs
class Fish (line 2) | class Fish
class EntriesCustomFilter (line 3) | class EntriesCustomFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 12) | def get_type
method additional_entries (line 20) | def additional_entries
FILE: lib/docs/filters/fish/entries_sphinx.rb
type Docs (line 1) | module Docs
class Fish (line 2) | class Fish
class EntriesSphinxFilter (line 3) | class EntriesSphinxFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 16) | def get_type
method additional_entries (line 32) | def additional_entries
FILE: lib/docs/filters/flask/entries.rb
type Docs (line 1) | module Docs
class Flask (line 2) | class Flask
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 6) | def call
method get_name (line 19) | def get_name
method get_type (line 23) | def get_type
method include_default_entry? (line 34) | def include_default_entry?
method additional_entries (line 38) | def additional_entries
FILE: lib/docs/filters/flow/clean_html.rb
type Docs (line 1) | module Docs
class Flow (line 2) | class Flow
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 25) | def other
FILE: lib/docs/filters/flow/entries.rb
type Docs (line 1) | module Docs
class Flow (line 2) | class Flow
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
FILE: lib/docs/filters/fluture/clean_html.rb
type Docs (line 1) | module Docs
class Fluture (line 2) | class Fluture
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/fluture/entries.rb
type Docs (line 1) | module Docs
class EntryIndex (line 2) | class EntryIndex
method types_as_json (line 4) | def types_as_json
class Fluture (line 17) | class Fluture
class EntriesFilter (line 18) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 20) | def additional_entries
FILE: lib/docs/filters/gcc/clean_html.rb
type Docs (line 1) | module Docs
class Gcc (line 2) | class Gcc
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/git/clean_html.rb
type Docs (line 1) | module Docs
class Git (line 2) | class Git
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 10) | def root
method other (line 14) | def other
FILE: lib/docs/filters/git/entries.rb
type Docs (line 1) | module Docs
class Git (line 2) | class Git
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 12) | def get_type
FILE: lib/docs/filters/github/clean_html.rb
type Docs (line 1) | module Docs
class Github (line 2) | class Github
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/gnu/clean_html.rb
type Docs (line 1) | module Docs
class Gnu (line 2) | class Gnu
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/gnu/entries.rb
type Docs (line 1) | module Docs
class Gnu (line 2) | class Gnu
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method initialize (line 6) | def initialize(*)
method get_name (line 11) | def get_name
method get_type (line 18) | def get_type
method detect_chapters (line 24) | def detect_chapters
method chapter_number (line 37) | def chapter_number
FILE: lib/docs/filters/gnu_cobol/clean_html.rb
type Docs (line 1) | module Docs
class GnuCobol (line 2) | class GnuCobol
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/gnu_cobol/entries.rb
type Docs (line 1) | module Docs
class GnuCobol (line 2) | class GnuCobol
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 6) | def additional_entries
method create_entry (line 22) | def create_entry(parent_link, current_link)
FILE: lib/docs/filters/gnu_make/clean_html.rb
type Docs (line 1) | module Docs
class GnuMake (line 2) | class GnuMake
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/gnu_make/entries.rb
type Docs (line 1) | module Docs
class GnuMake (line 2) | class GnuMake
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 27) | def get_name
method get_type (line 43) | def get_type
method additional_entries (line 49) | def additional_entries
FILE: lib/docs/filters/gnuplot/clean_html.rb
type Docs (line 2) | module Docs
class Gnuplot (line 3) | class Gnuplot
class CleanHtmlFilter (line 4) | class CleanHtmlFilter < Filter
method call (line 5) | def call
method dedent (line 70) | def dedent string
FILE: lib/docs/filters/gnuplot/entries.rb
type Docs (line 1) | module Docs
class Gnuplot (line 2) | class Gnuplot
class EntriesFilter (line 8) | class EntriesFilter < Docs::EntriesFilter
method initialize (line 9) | def initialize(*)
method get_name (line 13) | def get_name
method get_type (line 18) | def get_type
method include_default_entry? (line 26) | def include_default_entry?
method additional_entries (line 30) | def additional_entries
FILE: lib/docs/filters/go/attribution.rb
type Docs (line 3) | module Docs
class Go (line 4) | class Go
class AttributionFilter (line 5) | class AttributionFilter < Docs::AttributionFilter
method attribution_link (line 6) | def attribution_link
FILE: lib/docs/filters/go/clean_html.rb
type Docs (line 1) | module Docs
class Go (line 2) | class Go
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/go/entries.rb
type Docs (line 1) | module Docs
class Go (line 2) | class Go
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 15) | def get_type
method additional_entries (line 24) | def additional_entries
method include_default_entry? (line 45) | def include_default_entry?
FILE: lib/docs/filters/godot/clean_html.rb
type Docs (line 1) | module Docs
class Godot (line 2) | class Godot
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/godot/clean_html_v2.rb
type Docs (line 1) | module Docs
class Godot (line 2) | class Godot
class CleanHtmlV2Filter (line 3) | class CleanHtmlV2Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/godot/clean_html_v3.rb
type Docs (line 1) | module Docs
class Godot (line 2) | class Godot
class CleanHtmlV3Filter (line 3) | class CleanHtmlV3Filter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/godot/entries.rb
type Docs (line 1) | module Docs
class Godot (line 2) | class Godot
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 20) | def additional_entries
method include_default_entry? (line 33) | def include_default_entry?
FILE: lib/docs/filters/godot/entries_v2.rb
type Docs (line 1) | module Docs
class Godot (line 2) | class Godot
class EntriesV2Filter (line 3) | class EntriesV2Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 18) | def get_type
method additional_entries (line 26) | def additional_entries
method include_default_entry? (line 38) | def include_default_entry?
FILE: lib/docs/filters/godot/entries_v3.rb
type Docs (line 1) | module Docs
class Godot (line 2) | class Godot
class EntriesV3Filter (line 3) | class EntriesV3Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 20) | def additional_entries
method include_default_entry? (line 32) | def include_default_entry?
FILE: lib/docs/filters/graphite/clean_html.rb
type Docs (line 1) | module Docs
class Graphite (line 2) | class Graphite
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/graphite/entries.rb
type Docs (line 1) | module Docs
class Graphite (line 2) | class Graphite
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/graphviz/clean_html.rb
type Docs (line 1) | module Docs
class Graphviz (line 2) | class Graphviz
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/graphviz/entries.rb
type Docs (line 1) | module Docs
class Graphviz (line 2) | class Graphviz
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
FILE: lib/docs/filters/groovy/clean_html.rb
type Docs (line 1) | module Docs
class Groovy (line 2) | class Groovy
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method new_node (line 4) | def new_node(content)
method call (line 10) | def call
FILE: lib/docs/filters/groovy/entries.rb
type Docs (line 1) | module Docs
class Groovy (line 2) | class Groovy
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method include_default_entry? (line 12) | def include_default_entry?
method additional_entries (line 16) | def additional_entries
FILE: lib/docs/filters/grunt/clean_html.rb
type Docs (line 1) | module Docs
class Grunt (line 2) | class Grunt
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/grunt/entries.rb
type Docs (line 1) | module Docs
class Grunt (line 2) | class Grunt
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 16) | def additional_entries
method include_default_entry? (line 29) | def include_default_entry?
FILE: lib/docs/filters/gtk/clean_html.rb
type Docs (line 1) | module Docs
class Gtk (line 2) | class Gtk
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/gtk/entries.rb
type Docs (line 1) | module Docs
class Gtk (line 2) | class Gtk
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 36) | def call
method process_toc (line 53) | def process_toc(toc_dl_node, parent_path)
method breadcrumbs (line 65) | def breadcrumbs
method get_breadcrumbs (line 69) | def get_breadcrumbs
method get_name (line 82) | def get_name
method get_type (line 86) | def get_type
method additional_entries (line 90) | def additional_entries
FILE: lib/docs/filters/hammerspoon/clean_html.rb
type Docs (line 1) | module Docs
class Hammerspoon (line 2) | class Hammerspoon
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/hammerspoon/entries.rb
type Docs (line 1) | module Docs
class Hammerspoon (line 2) | class Hammerspoon
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
method include_default_entry? (line 62) | def include_default_entry?
FILE: lib/docs/filters/handlebars/clean_html.rb
type Docs (line 1) | module Docs
class Handlebars (line 2) | class Handlebars
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/handlebars/entries.rb
type Docs (line 1) | module Docs
class Handlebars (line 2) | class Handlebars
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/hapi/clean_html.rb
type Docs (line 1) | module Docs
class Hapi (line 3) | class Hapi
class CleanHtmlFilter (line 4) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/hapi/entries.rb
type Docs (line 1) | module Docs
class EntryIndex (line 3) | class EntryIndex
method entries_as_json (line 5) | def entries_as_json
method types_as_json (line 17) | def types_as_json
class Hapi (line 30) | class Hapi
class EntriesFilter (line 31) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 32) | def additional_entries
FILE: lib/docs/filters/haproxy/clean_html.rb
type Docs (line 1) | module Docs
class Haproxy (line 2) | class Haproxy
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/haproxy/entries.rb
type Docs (line 1) | module Docs
class Haproxy (line 2) | class Haproxy
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 14) | def get_name
method get_type (line 18) | def get_type
method additional_entries (line 22) | def additional_entries
method include_default_entry? (line 44) | def include_default_entry?
FILE: lib/docs/filters/haskell/clean_html.rb
type Docs (line 1) | module Docs
class Haskell (line 2) | class Haskell
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method guide (line 14) | def guide
method api (line 20) | def api
FILE: lib/docs/filters/haskell/entries.rb
type Docs (line 1) | module Docs
class Haskell (line 2) | class Haskell
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 25) | def get_name
method get_type (line 35) | def get_type
method additional_entries (line 51) | def additional_entries
method include_default_entry? (line 73) | def include_default_entry?
FILE: lib/docs/filters/haxe/clean_html.rb
type Docs (line 1) | module Docs
class Haxe (line 2) | class Haxe
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/haxe/entries.rb
type Docs (line 1) | module Docs
class Haxe (line 2) | class Haxe
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 11) | def get_type
method additional_entries (line 20) | def additional_entries
method include_default_entry? (line 32) | def include_default_entry?
FILE: lib/docs/filters/homebrew/clean_html.rb
type Docs (line 1) | module Docs
class Homebrew (line 2) | class Homebrew
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/homebrew/entries.rb
type Docs (line 1) | module Docs
class Homebrew (line 2) | class Homebrew
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 34) | def get_type
FILE: lib/docs/filters/html/clean_html.rb
type Docs (line 1) | module Docs
class Html (line 2) | class Html
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/html/entries.rb
type Docs (line 1) | module Docs
class Html (line 2) | class Html
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 6) | def get_name
method get_type (line 17) | def get_type
method include_default_entry? (line 29) | def include_default_entry?
method additional_entries (line 34) | def additional_entries
FILE: lib/docs/filters/htmx/clean_html.rb
type Docs (line 1) | module Docs
class Htmx (line 2) | class Htmx
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/htmx/entries.rb
type Docs (line 1) | module Docs
class Htmx (line 2) | class Htmx
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 22) | def additional_entries
FILE: lib/docs/filters/http/clean_html.rb
type Docs (line 1) | module Docs
class Http (line 2) | class Http
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method mdn (line 9) | def mdn
method ietf (line 27) | def ietf
FILE: lib/docs/filters/http/entries.rb
type Docs (line 1) | module Docs
class Http (line 2) | class Http
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 24) | def get_type
method rfc (line 42) | def rfc
method additional_entries (line 89) | def additional_entries
FILE: lib/docs/filters/i3/entries.rb
type Docs (line 1) | module Docs
class I3 (line 2) | class I3
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/immutable/clean_html.rb
type Docs (line 1) | module Docs
class Immutable (line 2) | class Immutable
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/immutable/entries.rb
type Docs (line 1) | module Docs
class Immutable (line 2) | class Immutable
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 13) | def additional_entries
FILE: lib/docs/filters/influxdata/clean_html.rb
type Docs (line 1) | module Docs
class Influxdata (line 2) | class Influxdata
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/influxdata/entries.rb
type Docs (line 1) | module Docs
class Influxdata (line 2) | class Influxdata
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method include_default_entry? (line 29) | def include_default_entry?
FILE: lib/docs/filters/jasmine/clean_html.rb
type Docs (line 1) | module Docs
class Jasmine (line 2) | class Jasmine
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/jasmine/entries.rb
type Docs (line 1) | module Docs
class Jasmine (line 2) | class Jasmine
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/javascript/clean_html.rb
type Docs (line 1) | module Docs
class Javascript (line 2) | class Javascript
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 12) | def other
FILE: lib/docs/filters/javascript/entries.rb
type Docs (line 1) | module Docs
class Javascript (line 2) | class Javascript
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 9) | def get_name
method get_type (line 45) | def get_type
method additional_entries (line 74) | def additional_entries
method include_default_entry? (line 90) | def include_default_entry?
FILE: lib/docs/filters/jekyll/clean_html.rb
type Docs (line 1) | module Docs
class Jekyll (line 2) | class Jekyll
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/jekyll/entries.rb
type Docs (line 1) | module Docs
class Jekyll (line 2) | class Jekyll
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 22) | def get_name
method get_type (line 30) | def get_type
FILE: lib/docs/filters/jest/clean_html.rb
type Docs (line 1) | module Docs
class Jest (line 2) | class Jest
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/jest/entries.rb
type Docs (line 1) | module Docs
class Jest (line 2) | class Jest
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 26) | def additional_entries
FILE: lib/docs/filters/jinja/entries.rb
type Docs (line 1) | module Docs
class Jinja (line 2) | class Jinja
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method include_default_entry? (line 13) | def include_default_entry?
method additional_entries (line 17) | def additional_entries
FILE: lib/docs/filters/joi/clean_html.rb
type Docs (line 1) | module Docs
class Joi (line 3) | class Joi
class CleanHtmlFilter (line 4) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/joi/entries.rb
type Docs (line 1) | module Docs
class EntryIndex (line 3) | class EntryIndex
method entries_as_json (line 5) | def entries_as_json
method types_as_json (line 17) | def types_as_json
class Joi (line 30) | class Joi
class EntriesFilter (line 31) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 32) | def additional_entries
FILE: lib/docs/filters/jq/clean_html.rb
type Docs (line 1) | module Docs
class Jq (line 2) | class Jq
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/jq/entries.rb
type Docs (line 1) | module Docs
class Jq (line 2) | class Jq
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method include_default_entry? (line 4) | def include_default_entry?
method additional_entries (line 8) | def additional_entries
FILE: lib/docs/filters/jquery/clean_html.rb
type Docs (line 1) | module Docs
class Jquery (line 2) | class Jquery
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/jquery_core/entries.rb
type Docs (line 1) | module Docs
class JqueryCore (line 2) | class JqueryCore
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 9) | def get_name
method get_type (line 16) | def get_type
FILE: lib/docs/filters/jquery_mobile/entries.rb
type Docs (line 1) | module Docs
class JqueryMobile (line 2) | class JqueryMobile
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 7) | def get_name
method get_type (line 15) | def get_type
FILE: lib/docs/filters/jquery_ui/entries.rb
type Docs (line 1) | module Docs
class JqueryUi (line 2) | class JqueryUi
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 7) | def get_name
method get_type (line 14) | def get_type
FILE: lib/docs/filters/jsdoc/clean_html.rb
type Docs (line 1) | module Docs
class Jsdoc (line 2) | class Jsdoc
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/jsdoc/entries.rb
type Docs (line 1) | module Docs
class Jsdoc (line 2) | class Jsdoc
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
FILE: lib/docs/filters/julia/clean_html.rb
type Docs (line 1) | module Docs
class Julia (line 2) | class Julia
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/julia/clean_html_sphinx.rb
type Docs (line 1) | module Docs
class Julia (line 2) | class Julia
class CleanHtmlSphinxFilter (line 3) | class CleanHtmlSphinxFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/julia/entries.rb
type Docs (line 1) | module Docs
class Julia (line 2) | class Julia
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 16) | def additional_entries
FILE: lib/docs/filters/julia/entries_sphinx.rb
type Docs (line 1) | module Docs
class Julia (line 2) | class Julia
class EntriesSphinxFilter (line 3) | class EntriesSphinxFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 18) | def additional_entries
FILE: lib/docs/filters/knockout/clean_html.rb
type Docs (line 1) | module Docs
class Knockout (line 2) | class Knockout
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 24) | def root
method other (line 29) | def other
FILE: lib/docs/filters/knockout/entries.rb
type Docs (line 1) | module Docs
class Knockout (line 2) | class Knockout
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 16) | def get_name
method get_type (line 26) | def get_type
FILE: lib/docs/filters/koa/clean_html.rb
type Docs (line 3) | module Docs
class Koa (line 4) | class Koa
class CleanHtmlFilter (line 5) | class CleanHtmlFilter < Filter
method call (line 6) | def call
method fix_homepage (line 16) | def fix_homepage
FILE: lib/docs/filters/koa/entries.rb
type Docs (line 1) | module Docs
class Koa (line 2) | class Koa
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method additional_entries (line 9) | def additional_entries
method get_type (line 24) | def get_type
FILE: lib/docs/filters/kotlin/clean_html.rb
type Docs (line 1) | module Docs
class Kotlin (line 2) | class Kotlin
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method doc_page (line 9) | def doc_page
method api_page (line 17) | def api_page
FILE: lib/docs/filters/kotlin/entries.rb
type Docs (line 1) | module Docs
class Kotlin (line 2) | class Kotlin
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 13) | def get_type
method breadcrumbs (line 23) | def breadcrumbs
FILE: lib/docs/filters/kubectl/clean_html.rb
type Docs (line 1) | module Docs
class Kubectl (line 2) | class Kubectl
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/kubectl/entries.rb
type Docs (line 1) | module Docs
class Kubectl (line 2) | class Kubectl
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 13) | def additional_entries
method include_default_entry? (line 33) | def include_default_entry?
FILE: lib/docs/filters/kubernetes/clean_html.rb
type Docs (line 1) | module Docs
class Kubernetes (line 2) | class Kubernetes
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/kubernetes/entries.rb
type Docs (line 1) | module Docs
class Kubernetes (line 2) | class Kubernetes
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 13) | def additional_entries
FILE: lib/docs/filters/laravel/clean_html.rb
type Docs (line 1) | module Docs
class Laravel (line 2) | class Laravel
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method api (line 27) | def api
method other (line 65) | def other
FILE: lib/docs/filters/laravel/entries.rb
type Docs (line 1) | module Docs
class Laravel (line 2) | class Laravel
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 14) | def get_type
method additional_entries (line 34) | def additional_entries
method api_page? (line 49) | def api_page?
method include_default_entry? (line 53) | def include_default_entry?
FILE: lib/docs/filters/latex/clean_html.rb
type Docs (line 1) | module Docs
class Latex (line 2) | class Latex
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/latex/entries.rb
type Docs (line 1) | module Docs
class Latex (line 2) | class Latex
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method initialize (line 7) | def initialize(*)
method get_name (line 22) | def get_name
method get_type (line 26) | def get_type
method include_default_entry? (line 34) | def include_default_entry?
method additional_entries (line 38) | def additional_entries
FILE: lib/docs/filters/leaflet/clean_html.rb
type Docs (line 1) | module Docs
class Leaflet (line 2) | class Leaflet
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/leaflet/entries.rb
type Docs (line 1) | module Docs
class Leaflet (line 2) | class Leaflet
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/less/clean_html.rb
type Docs (line 1) | module Docs
class Less (line 2) | class Less
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/less/entries.rb
type Docs (line 1) | module Docs
class Less (line 2) | class Less
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method name (line 4) | def name
method type (line 8) | def type
method additional_entries (line 12) | def additional_entries
method language_entries (line 16) | def language_entries
method function_entries (line 47) | def function_entries
FILE: lib/docs/filters/liquid/clean_html.rb
type Docs (line 1) | module Docs
class Liquid (line 2) | class Liquid
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/liquid/entries.rb
type Docs (line 1) | module Docs
class Liquid (line 2) | class Liquid
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/lit/clean_html.rb
type Docs (line 1) | module Docs
class Lit (line 2) | class Lit
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/lit/entries.rb
type Docs (line 1) | module Docs
class Lit (line 2) | class Lit
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 19) | def additional_entries
FILE: lib/docs/filters/lodash/clean_html.rb
type Docs (line 1) | module Docs
class Lodash (line 2) | class Lodash
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/lodash/entries.rb
type Docs (line 1) | module Docs
class Lodash (line 2) | class Lodash
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/love/clean_html.rb
type Docs (line 1) | module Docs
class Love (line 2) | class Love
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/love/entries.rb
type Docs (line 1) | module Docs
class Love (line 2) | class Love
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 29) | def call
method get_type (line 39) | def get_type
FILE: lib/docs/filters/lua/clean_html.rb
type Docs (line 1) | module Docs
class Lua (line 2) | class Lua
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/lua/entries.rb
type Docs (line 1) | module Docs
class Lua (line 2) | class Lua
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/man/clean_html.rb
type Docs (line 1) | module Docs
class Man (line 2) | class Man
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/man/entries.rb
type Docs (line 1) | module Docs
class Man (line 2) | class Man
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 7) | def get_name
method get_type (line 12) | def get_type
method build_types (line 17) | def build_types
FILE: lib/docs/filters/mariadb/clean_html.rb
type Docs (line 1) | module Docs
class Mariadb (line 2) | class Mariadb
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/mariadb/entries.rb
type Docs (line 1) | module Docs
class Mariadb (line 2) | class Mariadb
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method entries (line 18) | def entries
FILE: lib/docs/filters/mariadb/erase_invalid_pages.rb
type Docs (line 1) | module Docs
class Mariadb (line 2) | class Mariadb
class EraseInvalidPagesFilter (line 3) | class EraseInvalidPagesFilter < Filter
method call (line 6) | def call
FILE: lib/docs/filters/marionette/clean_html.rb
type Docs (line 1) | module Docs
class Marionette (line 2) | class Marionette
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 14) | def other
FILE: lib/docs/filters/marionette/entries_v2.rb
type Docs (line 1) | module Docs
class Marionette (line 2) | class Marionette
class EntriesV2Filter (line 3) | class EntriesV2Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 11) | def get_type
method additional_entries (line 18) | def additional_entries
FILE: lib/docs/filters/marionette/entries_v3.rb
type Docs (line 1) | module Docs
class Marionette (line 2) | class Marionette
class EntriesV3Filter (line 3) | class EntriesV3Filter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 11) | def get_type
method additional_entries (line 18) | def additional_entries
FILE: lib/docs/filters/markdown/clean_html.rb
type Docs (line 1) | module Docs
class Markdown (line 2) | class Markdown
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/markdown/entries.rb
type Docs (line 1) | module Docs
class Markdown (line 2) | class Markdown
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/matplotlib/entries.rb
type Docs (line 1) | module Docs
class Matplotlib (line 2) | class Matplotlib
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 13) | def get_name
method get_type (line 25) | def get_type
method additional_entries (line 34) | def additional_entries
FILE: lib/docs/filters/mdn/clean_html.rb
type Docs (line 1) | module Docs
class Mdn (line 2) | class Mdn
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 22) | def call
FILE: lib/docs/filters/mdn/compat_tables.rb
type Docs (line 1) | module Docs
class Mdn (line 2) | class Mdn
class CompatTablesFilter (line 3) | class CompatTablesFilter < Filter
method call (line 10) | def call
method is_javascript (line 41) | def is_javascript
method browsers (line 45) | def browsers
method browser_types (line 53) | def browser_types
method generate_compatibility_table (line 61) | def generate_compatibility_table()
method generate_compatibility_table_wrapper (line 71) | def generate_compatibility_table_wrapper(url)
method generate_basic_html_table (line 88) | def generate_basic_html_table
method add_entry_to_table (line 111) | def add_entry_to_table(html_table, key)
method add_data_to_entry (line 136) | def add_data_to_entry(json, entry)
FILE: lib/docs/filters/meteor/clean_html.rb
type Docs (line 1) | module Docs
class Meteor (line 2) | class Meteor
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/meteor/entries.rb
type Docs (line 1) | module Docs
class Meteor (line 2) | class Meteor
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 19) | def additional_entries
FILE: lib/docs/filters/minitest/entries.rb
type Docs (line 1) | module Docs
class Minitest (line 2) | class Minitest
class EntriesFilter (line 3) | class EntriesFilter < Docs::Rdoc::EntriesFilter
method get_type (line 4) | def get_type
FILE: lib/docs/filters/mkdocs/clean_html.rb
type Docs (line 1) | module Docs
class Mkdocs (line 2) | class Mkdocs
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Docs::Filter
method call (line 4) | def call
FILE: lib/docs/filters/mocha/clean_html.rb
type Docs (line 1) | module Docs
class Mocha (line 2) | class Mocha
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/mocha/entries.rb
type Docs (line 1) | module Docs
class Mocha (line 2) | class Mocha
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 19) | def additional_entries
FILE: lib/docs/filters/modernizr/clean_html.rb
type Docs (line 1) | module Docs
class Modernizr (line 2) | class Modernizr
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/modernizr/entries.rb
type Docs (line 1) | module Docs
class Modernizr (line 2) | class Modernizr
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/moment/clean_html.rb
type Docs (line 1) | module Docs
class Moment (line 2) | class Moment
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/moment/entries.rb
type Docs (line 1) | module Docs
class Moment (line 2) | class Moment
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 15) | def get_name
method get_type (line 21) | def get_type
method additional_entries (line 27) | def additional_entries
FILE: lib/docs/filters/moment_timezone/entries.rb
type Docs (line 1) | module Docs
class MomentTimezone (line 2) | class MomentTimezone
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 5) | def additional_entries
FILE: lib/docs/filters/mongoose/clean_html.rb
type Docs (line 1) | module Docs
class Mongoose (line 2) | class Mongoose
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/mongoose/entries.rb
type Docs (line 1) | module Docs
class Mongoose (line 2) | class Mongoose
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method get_type_from (line 18) | def get_type_from node
method additional_entries (line 28) | def additional_entries
FILE: lib/docs/filters/nextjs/clean_html.rb
type Docs (line 1) | module Docs
class Nextjs (line 2) | class Nextjs
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/nextjs/entries.rb
type Docs (line 1) | module Docs
class Nextjs (line 2) | class Nextjs
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 16) | def get_type
FILE: lib/docs/filters/nginx/clean_html.rb
type Docs (line 1) | module Docs
class Nginx (line 2) | class Nginx
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/nginx/entries.rb
type Docs (line 1) | module Docs
class Nginx (line 2) | class Nginx
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 20) | def additional_entries
FILE: lib/docs/filters/nginx_lua_module/clean_html.rb
type Docs (line 1) | module Docs
class NginxLuaModule (line 2) | class NginxLuaModule
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/nginx_lua_module/entries.rb
type Docs (line 1) | module Docs
class NginxLuaModule (line 2) | class NginxLuaModule
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/nim/clean_html.rb
type Docs (line 1) | module Docs
class Nim (line 2) | class Nim
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/nim/entries.rb
type Docs (line 1) | module Docs
class Nim (line 2) | class Nim
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 13) | def get_name
method get_type (line 25) | def get_type
method additional_entries (line 35) | def additional_entries
FILE: lib/docs/filters/nix/clean_html.rb
type Docs (line 1) | module Docs
class Nix (line 2) | class Nix
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method strip_section_number (line 100) | def strip_section_number(title_children)
method prefix_with (line 110) | def prefix_with(title_node, text)
method unwrap (line 116) | def unwrap(node)
FILE: lib/docs/filters/nix/entries.rb
type Docs (line 1) | module Docs
class Nix (line 2) | class Nix
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method include_default_entry? (line 4) | def include_default_entry?
method additional_entries (line 8) | def additional_entries
FILE: lib/docs/filters/node/clean_html.rb
type Docs (line 1) | module Docs
class Node (line 2) | class Node
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/node/entries.rb
type Docs (line 1) | module Docs
class Node (line 2) | class Node
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 13) | def additional_entries
FILE: lib/docs/filters/node/old_entries.rb
type Docs (line 1) | module Docs
class Node (line 2) | class Node
class OldEntriesFilter (line 3) | class OldEntriesFilter < Docs::EntriesFilter
method get_name (line 23) | def get_name
method get_type (line 27) | def get_type
method additional_entries (line 33) | def additional_entries
FILE: lib/docs/filters/nokogiri2/entries.rb
type Docs (line 1) | module Docs
class Nokogiri2 (line 2) | class Nokogiri2
class EntriesFilter (line 3) | class EntriesFilter < Docs::Rdoc::EntriesFilter
method get_type (line 4) | def get_type
method include_default_entry? (line 10) | def include_default_entry?
FILE: lib/docs/filters/npm/clean_html.rb
type Docs (line 1) | module Docs
class Npm (line 2) | class Npm
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/npm/entries.rb
type Docs (line 1) | module Docs
class Npm (line 2) | class Npm
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 13) | def additional_entries
FILE: lib/docs/filters/numpy/clean_html.rb
type Docs (line 1) | module Docs
class Numpy (line 2) | class Numpy
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/numpy/entries.rb
type Docs (line 1) | module Docs
class Numpy (line 2) | class Numpy
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 14) | def get_type
method additional_entries (line 76) | def additional_entries
method dt_to_name (line 91) | def dt_to_name(dt)
FILE: lib/docs/filters/nushell/clean_html.rb
type Docs (line 1) | module Docs
class Nushell (line 3) | class Nushell
class CleanHtmlFilter (line 4) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/nushell/entries.rb
type Docs (line 1) | module Docs
class EntryIndex (line 3) | class EntryIndex
method types_as_json (line 6) | def types_as_json
class Nushell (line 19) | class Nushell
class EntriesFilter (line 21) | class EntriesFilter < Docs::EntriesFilter
method include_default_entry? (line 22) | def include_default_entry?
method additional_entries (line 26) | def additional_entries
FILE: lib/docs/filters/nushell/fix_links.rb
type Docs (line 1) | module Docs
class Nushell (line 3) | class Nushell
class FixLinksFilter (line 4) | class FixLinksFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/ocaml/clean_html.rb
type Docs (line 1) | module Docs
class Ocaml (line 2) | class Ocaml
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/ocaml/entries.rb
type Docs (line 1) | module Docs
class Ocaml (line 2) | class Ocaml
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 23) | def get_type
method additional_entries (line 35) | def additional_entries
FILE: lib/docs/filters/octave/clean_html.rb
type Docs (line 1) | module Docs
class Octave (line 2) | class Octave
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 13) | def other
FILE: lib/docs/filters/octave/entries.rb
type Docs (line 1) | module Docs
class Octave (line 2) | class Octave
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 14) | def additional_entries
FILE: lib/docs/filters/opengl/clean_html.rb
type Docs (line 1) | module Docs
class Opengl (line 2) | class Opengl
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/opengl/entries.rb
type Docs (line 1) | module Docs
class Opengl (line 2) | class Opengl
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 15) | def additional_entries
FILE: lib/docs/filters/openjdk/clean_html.rb
type Docs (line 4) | module Docs
class Openjdk (line 5) | class Openjdk
class CleanHtmlFilter (line 6) | class CleanHtmlFilter < Filter
method call (line 7) | def call
FILE: lib/docs/filters/openjdk/clean_html_new.rb
type Docs (line 1) | module Docs
class Openjdk (line 2) | class Openjdk
class CleanHtmlNewFilter (line 3) | class CleanHtmlNewFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/openjdk/clean_urls.rb
type Docs (line 3) | module Docs
class Openjdk (line 4) | class Openjdk
class CleanUrlsFilter (line 5) | class CleanUrlsFilter < Filter
method call (line 6) | def call
FILE: lib/docs/filters/openjdk/entries.rb
type Docs (line 3) | module Docs
class Openjdk (line 4) | class Openjdk
class EntriesFilter (line 5) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 6) | def get_name
method get_type (line 17) | def get_type
method additional_entries (line 29) | def additional_entries
FILE: lib/docs/filters/openjdk/entries_new.rb
type Docs (line 1) | module Docs
class Openjdk (line 2) | class Openjdk
class EntriesNewFilter (line 3) | class EntriesNewFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 16) | def get_type
method additional_entries (line 30) | def additional_entries
FILE: lib/docs/filters/openlayers/clean_html.rb
type Docs (line 1) | module Docs
class Openlayers (line 2) | class Openlayers
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/openlayers/entries.rb
type Docs (line 1) | module Docs
class Openlayers (line 2) | class Openlayers
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/opentsdb/clean_html.rb
type Docs (line 1) | module Docs
class Opentsdb (line 2) | class Opentsdb
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/opentsdb/entries.rb
type Docs (line 1) | module Docs
class Opentsdb (line 2) | class Opentsdb
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method breadcrumbs (line 20) | def breadcrumbs
FILE: lib/docs/filters/padrino/clean_html.rb
type Docs (line 1) | module Docs
class Padrino (line 2) | class Padrino
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/padrino/entries.rb
type Docs (line 1) | module Docs
class Padrino (line 2) | class Padrino
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
method include_default_entry? (line 24) | def include_default_entry?
FILE: lib/docs/filters/pandas/clean_html.rb
type Docs (line 1) | module Docs
class Pandas (line 2) | class Pandas
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/pandas/clean_html_old.rb
type Docs (line 1) | module Docs
class Pandas (line 2) | class Pandas
class CleanHtmlOldFilter (line 3) | class CleanHtmlOldFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/pandas/entries.rb
type Docs (line 1) | module Docs
class Pandas (line 2) | class Pandas
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
FILE: lib/docs/filters/pandas/entries_old.rb
type Docs (line 1) | module Docs
class Pandas (line 2) | class Pandas
class EntriesOldFilter (line 3) | class EntriesOldFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 20) | def get_type
FILE: lib/docs/filters/perl/clean_html.rb
type Docs (line 1) | module Docs
class Perl (line 2) | class Perl
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/perl/entries.rb
type Docs (line 1) | module Docs
class Perl (line 2) | class Perl
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 39) | def call
method get_name (line 70) | def get_name
method get_type (line 74) | def get_type
method additional_entries (line 87) | def additional_entries
FILE: lib/docs/filters/perl/pre_clean_html.rb
type Docs (line 1) | module Docs
class Perl (line 2) | class Perl
class PreCleanHtmlFilter (line 3) | class PreCleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/phalcon/clean_html.rb
type Docs (line 1) | module Docs
class Phalcon (line 2) | class Phalcon
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/phalcon/entries.rb
type Docs (line 1) | module Docs
class Phalcon (line 2) | class Phalcon
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 17) | def additional_entries
FILE: lib/docs/filters/phaser/clean_html.rb
type Docs (line 1) | module Docs
class Phaser (line 2) | class Phaser
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/phaser/entries.rb
type Docs (line 1) | module Docs
class Phaser (line 2) | class Phaser
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 17) | def get_name
method get_type (line 25) | def get_type
method additional_entries (line 43) | def additional_entries
FILE: lib/docs/filters/php/clean_html.rb
type Docs (line 2) | module Docs
class Php (line 3) | class Php
class CleanHtmlFilter (line 4) | class CleanHtmlFilter < Filter
method call (line 6) | def call
method root (line 12) | def root
method other (line 16) | def other
FILE: lib/docs/filters/php/entries.rb
type Docs (line 1) | module Docs
class Php (line 2) | class Php
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 97) | def get_name
method get_type (line 112) | def get_type
method additional_entries (line 155) | def additional_entries
method include_default_entry? (line 175) | def include_default_entry?
FILE: lib/docs/filters/php/fix_urls.rb
type Docs (line 1) | module Docs
class Php (line 2) | class Php
class FixUrlsFilter (line 3) | class FixUrlsFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/php/internal_urls.rb
type Docs (line 1) | module Docs
class Php (line 2) | class Php
class InternalUrlsFilter (line 3) | class InternalUrlsFilter < Filter
method call (line 4) | def call
method internal_urls (line 14) | def internal_urls
FILE: lib/docs/filters/phpunit/clean_html.rb
type Docs (line 1) | module Docs
class Phpunit (line 2) | class Phpunit
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/phpunit/clean_html_old.rb
type Docs (line 1) | module Docs
class Phpunit (line 2) | class Phpunit
class CleanHtmlOldFilter (line 3) | class CleanHtmlOldFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 13) | def other
FILE: lib/docs/filters/phpunit/entries.rb
type Docs (line 1) | module Docs
class Phpunit (line 2) | class Phpunit
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 18) | def additional_entries
FILE: lib/docs/filters/phpunit/entries_old.rb
type Docs (line 1) | module Docs
class Phpunit (line 2) | class Phpunit
class EntriesOldFilter (line 3) | class EntriesOldFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 16) | def additional_entries
FILE: lib/docs/filters/playwright/clean_html.rb
type Docs (line 1) | module Docs
class Playwright (line 2) | class Playwright
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/playwright/entries.rb
type Docs (line 1) | module Docs
class Playwright (line 2) | class Playwright
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method type (line 8) | def type
method additional_entries (line 14) | def additional_entries
FILE: lib/docs/filters/point_cloud_library/clean_html.rb
type Docs (line 1) | module Docs
class PointCloudLibrary (line 2) | class PointCloudLibrary
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/point_cloud_library/entries.rb
type Docs (line 1) | module Docs
class PointCloudLibrary (line 2) | class PointCloudLibrary
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_type (line 4) | def get_type
method get_name (line 12) | def get_name
method additional_entries (line 16) | def additional_entries
FILE: lib/docs/filters/pony/clean_html.rb
type Docs (line 1) | module Docs
class Pony (line 2) | class Pony
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/pony/entries.rb
type Docs (line 1) | module Docs
class Pony (line 2) | class Pony
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 14) | def additional_entries
FILE: lib/docs/filters/postgresql/clean_html.rb
type Docs (line 1) | module Docs
class Postgresql (line 2) | class Postgresql
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 9) | def root
method other (line 13) | def other
FILE: lib/docs/filters/postgresql/entries.rb
type Docs (line 1) | module Docs
class Postgresql (line 2) | class Postgresql
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method base_name (line 43) | def base_name
method heading_level (line 47) | def heading_level
method get_name (line 51) | def get_name
method get_type (line 63) | def get_type
method additional_entries (line 88) | def additional_entries
method config_additional_entries (line 122) | def config_additional_entries
method data_types_additional_entries (line 129) | def data_types_additional_entries
method command_additional_entries (line 141) | def command_additional_entries
method include_default_entry? (line 151) | def include_default_entry?
method skip_additional_entries? (line 171) | def skip_additional_entries?
method clean_heading_name (line 180) | def clean_heading_name(name)
method get_heading_entries (line 191) | def get_heading_entries(selector)
method get_custom_entries (line 201) | def get_custom_entries(selector)
method additional_entry_prefix (line 221) | def additional_entry_prefix
method skip_heading? (line 225) | def skip_heading?(name)
FILE: lib/docs/filters/postgresql/extract_metadata.rb
type Docs (line 1) | module Docs
class Postgresql (line 2) | class Postgresql
class ExtractMetadataFilter (line 3) | class ExtractMetadataFilter < Filter
method call (line 4) | def call
method extract_up_path (line 10) | def extract_up_path
method extract_chapter (line 16) | def extract_chapter
FILE: lib/docs/filters/postgresql/normalize_class_names.rb
type Docs (line 1) | module Docs
class Postgresql (line 2) | class Postgresql
class NormalizeClassNamesFilter (line 3) | class NormalizeClassNamesFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/prettier/clean_html.rb
type Docs (line 1) | module Docs
class Prettier (line 2) | class Prettier
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/prettier/entries.rb
type Docs (line 1) | module Docs
class Prettier (line 2) | class Prettier
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method type (line 8) | def type
method additional_entries (line 17) | def additional_entries
FILE: lib/docs/filters/pug/clean_html.rb
type Docs (line 1) | module Docs
class Pug (line 2) | class Pug
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/pug/entries.rb
type Docs (line 1) | module Docs
class Pug (line 2) | class Pug
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 16) | def additional_entries
FILE: lib/docs/filters/puppeteer/clean_html.rb
type Docs (line 1) | module Docs
class Puppeteer (line 2) | class Puppeteer
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/puppeteer/entries.rb
type Docs (line 1) | module Docs
class Puppeteer (line 2) | class Puppeteer
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 6) | def additional_entries
FILE: lib/docs/filters/pygame/clean_html.rb
type Docs (line 1) | module Docs
class Pygame (line 2) | class Pygame
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 10) | def root
method other (line 24) | def other
FILE: lib/docs/filters/pygame/entries.rb
type Docs (line 1) | module Docs
class Pygame (line 2) | class Pygame
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/pygame/pre_clean_html.rb
type Docs (line 1) | module Docs
class Pygame (line 2) | class Pygame
class PreCleanHtmlFilter (line 3) | class PreCleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/python/clean_html.rb
type Docs (line 1) | module Docs
class Python (line 2) | class Python
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 12) | def root
method other (line 16) | def other
FILE: lib/docs/filters/python/entries_v2.rb
type Docs (line 1) | module Docs
class Python (line 2) | class Python
class EntriesV2Filter (line 3) | class EntriesV2Filter < Docs::EntriesFilter
method get_name (line 18) | def get_name
method get_type (line 28) | def get_type
method include_default_entry? (line 51) | def include_default_entry?
method additional_entries (line 55) | def additional_entries
method clean_id_attributes (line 71) | def clean_id_attributes
FILE: lib/docs/filters/python/entries_v3.rb
type Docs (line 1) | module Docs
class Python (line 2) | class Python
class EntriesV3Filter (line 3) | class EntriesV3Filter < Docs::EntriesFilter
method get_name (line 18) | def get_name
method get_type (line 28) | def get_type
method include_h2? (line 60) | def include_h2?
method include_default_entry? (line 64) | def include_default_entry?
method additional_entries (line 70) | def additional_entries
method clean_id_attributes (line 100) | def clean_id_attributes
method additional_entries_index (line 109) | def additional_entries_index
FILE: lib/docs/filters/pytorch/clean_html.rb
type Docs (line 1) | module Docs
class Pytorch (line 2) | class Pytorch
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/pytorch/entries.rb
type Docs (line 1) | module Docs
class Pytorch (line 2) | class Pytorch
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_breadcrumbs (line 4) | def get_breadcrumbs
method get_name (line 24) | def get_name
method get_type (line 28) | def get_type
method include_default_entry? (line 36) | def include_default_entry?
method additional_entries (line 40) | def additional_entries
FILE: lib/docs/filters/q/entries.rb
type Docs (line 1) | module Docs
class Q (line 2) | class Q
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/qt/clean_html.rb
type Docs (line 1) | module Docs
class Qt (line 2) | class Qt
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/qt/entries.rb
type Docs (line 3) | module Docs
class Qt (line 4) | class Qt
class EntriesFilter (line 5) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 6) | def get_name
method get_type (line 21) | def get_type
method include_default_entry? (line 26) | def include_default_entry?
method additional_entries (line 30) | def additional_entries
FILE: lib/docs/filters/qunit/clean_html.rb
type Docs (line 3) | module Docs
class Qunit (line 4) | class Qunit
class CleanHtmlFilter (line 5) | class CleanHtmlFilter < Filter
method call (line 6) | def call
FILE: lib/docs/filters/qunit/entries.rb
type Docs (line 3) | module Docs
class Qunit (line 4) | class Qunit
class EntriesFilter (line 5) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 14) | def get_name
method get_type (line 18) | def get_type
FILE: lib/docs/filters/r/clean_html.rb
type Docs (line 1) | module Docs
class R (line 2) | class R
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/r/entries.rb
type Docs (line 1) | module Docs
class R (line 2) | class R
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 7) | def call
method slug_parts (line 20) | def slug_parts
method is_package? (line 24) | def is_package?
method is_manual? (line 28) | def is_manual?
method get_name (line 32) | def get_name
method get_type (line 38) | def get_type
method include_default_entry? (line 43) | def include_default_entry?
method manual_section (line 47) | def manual_section(node)
method additional_entries (line 52) | def additional_entries
FILE: lib/docs/filters/rails/clean_html_guides.rb
type Docs (line 1) | module Docs
class Rails (line 2) | class Rails
class CleanHtmlGuidesFilter (line 3) | class CleanHtmlGuidesFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/rails/entries.rb
type Docs (line 1) | module Docs
class Rails (line 2) | class Rails
class EntriesFilter (line 3) | class EntriesFilter < Docs::Rdoc::EntriesFilter
method get_name (line 41) | def get_name
method get_type (line 51) | def get_type
method include_default_entry? (line 71) | def include_default_entry?
method additional_entries (line 77) | def additional_entries
method skip? (line 83) | def skip?
FILE: lib/docs/filters/ramda/clean_html.rb
type Docs (line 1) | module Docs
class Ramda (line 2) | class Ramda
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/ramda/entries.rb
type Docs (line 1) | module Docs
class Ramda (line 2) | class Ramda
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 4) | def additional_entries
FILE: lib/docs/filters/rdoc/clean_html.rb
type Docs (line 1) | module Docs
class Rdoc (line 2) | class Rdoc
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method root (line 11) | def root
method other (line 20) | def other
FILE: lib/docs/filters/rdoc/container.rb
type Docs (line 1) | module Docs
class Rdoc (line 2) | class Rdoc
class ContainerFilter (line 3) | class ContainerFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/rdoc/entries.rb
type Docs (line 1) | module Docs
class Rdoc (line 2) | class Rdoc
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 13) | def get_type
method include_default_entry? (line 24) | def include_default_entry?
method additional_entries (line 30) | def additional_entries
FILE: lib/docs/filters/react/clean_html.rb
type Docs (line 1) | module Docs
class React (line 2) | class React
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/react/clean_html_react_dev.rb
type Docs (line 1) | module Docs
class React (line 2) | class React
class CleanHtmlReactDevFilter (line 3) | class CleanHtmlReactDevFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/react/entries.rb
type Docs (line 1) | module Docs
class React (line 2) | class React
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 22) | def additional_entries
FILE: lib/docs/filters/react/entries_react_dev.rb
type Docs (line 1) | module Docs
class React (line 2) | class React
class EntriesReactDevFilter (line 3) | class EntriesReactDevFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method update_canary_copy (line 25) | def update_canary_copy(string)
FILE: lib/docs/filters/react_bootstrap/clean_html.rb
type Docs (line 1) | module Docs
class ReactBootstrap (line 2) | class ReactBootstrap
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/react_bootstrap/entries.rb
type Docs (line 1) | module Docs
class ReactBootstrap (line 2) | class ReactBootstrap
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 12) | def get_type
FILE: lib/docs/filters/react_native/clean_html.rb
type Docs (line 1) | module Docs
class ReactNative (line 2) | class ReactNative
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/react_native/entries.rb
type Docs (line 1) | module Docs
class ReactNative (line 2) | class ReactNative
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 14) | def additional_entries
FILE: lib/docs/filters/react_router/clean_html.rb
type Docs (line 1) | module Docs
class ReactRouter (line 2) | class ReactRouter
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/react_router/entries.rb
type Docs (line 1) | module Docs
class ReactRouter (line 2) | class ReactRouter
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/reactivex/clean_html.rb
type Docs (line 1) | module Docs
class Reactivex (line 2) | class Reactivex
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/reactivex/entries.rb
type Docs (line 1) | module Docs
class Reactivex (line 2) | class Reactivex
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 10) | def get_type
method is_backpressure_operators? (line 16) | def is_backpressure_operators?
FILE: lib/docs/filters/redis/clean_html.rb
type Docs (line 1) | module Docs
class Redis (line 2) | class Redis
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/redis/entries.rb
type Docs (line 1) | module Docs
class Redis (line 2) | class Redis
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
FILE: lib/docs/filters/redux/clean_html.rb
type Docs (line 1) | module Docs
class Redux (line 2) | class Redux
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/redux/entries.rb
type Docs (line 1) | module Docs
class Redux (line 2) | class Redux
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 10) | def get_type
method additional_entries (line 14) | def additional_entries
FILE: lib/docs/filters/relay/clean_html.rb
type Docs (line 1) | module Docs
class Relay (line 2) | class Relay
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/relay/entries.rb
type Docs (line 1) | module Docs
class Relay (line 2) | class Relay
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 7) | def call
method get_name (line 19) | def get_name
method get_type (line 23) | def get_type
method include_default_entry? (line 27) | def include_default_entry?
method additional_entries (line 31) | def additional_entries
FILE: lib/docs/filters/requests/entries.rb
type Docs (line 1) | module Docs
class Requests (line 2) | class Requests
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method call (line 6) | def call
method get_name (line 19) | def get_name
method get_type (line 23) | def get_type
method include_default_entry? (line 27) | def include_default_entry?
method additional_entries (line 31) | def additional_entries
FILE: lib/docs/filters/requirejs/clean_html.rb
type Docs (line 1) | module Docs
class Requirejs (line 2) | class Requirejs
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/requirejs/entries.rb
type Docs (line 1) | module Docs
class Requirejs (line 2) | class Requirejs
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/rethinkdb/clean_html.rb
type Docs (line 1) | module Docs
class Rethinkdb (line 2) | class Rethinkdb
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/rethinkdb/entries.rb
type Docs (line 1) | module Docs
class Rethinkdb (line 2) | class Rethinkdb
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 20) | def get_type
method additional_entries (line 31) | def additional_entries
method include_default_entry? (line 38) | def include_default_entry?
FILE: lib/docs/filters/ruby/entries.rb
type Docs (line 1) | module Docs
class Ruby (line 2) | class Ruby
class EntriesFilter (line 3) | class EntriesFilter < Docs::Rdoc::EntriesFilter
method get_type (line 39) | def get_type
method additional_entries (line 56) | def additional_entries
method include_default_entry? (line 74) | def include_default_entry?
method guide? (line 78) | def guide?
FILE: lib/docs/filters/rust/clean_html.rb
type Docs (line 3) | module Docs
class Rust (line 4) | class Rust
class CleanHtmlFilter (line 5) | class CleanHtmlFilter < Filter
method call (line 6) | def call
FILE: lib/docs/filters/rust/entries.rb
type Docs (line 1) | module Docs
class Rust (line 2) | class Rust
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 38) | def get_type
method additional_entries (line 55) | def additional_entries
FILE: lib/docs/filters/rxjs/clean_html.rb
type Docs (line 1) | module Docs
class Rxjs (line 2) | class Rxjs
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
method lift_out_of_table (line 133) | def lift_out_of_table(node)
FILE: lib/docs/filters/rxjs/entries.rb
type Docs (line 1) | module Docs
class Rxjs (line 2) | class Rxjs
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 12) | def get_type
method additional_entries (line 22) | def additional_entries
FILE: lib/docs/filters/salt_stack/clean_html.rb
type Docs (line 1) | module Docs
class SaltStack (line 2) | class SaltStack
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/salt_stack/entries.rb
type Docs (line 1) | module Docs
class SaltStack (line 2) | class SaltStack
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 6) | def get_name
method get_type (line 18) | def get_type
method include_default_entry? (line 22) | def include_default_entry?
method additional_entries (line 26) | def additional_entries
FILE: lib/docs/filters/sanctuary/clean_html.rb
type Docs (line 1) | module Docs
class Sanctuary (line 3) | class Sanctuary
class CleanHtmlFilter (line 4) | class CleanHtmlFilter < Filter
method call (line 5) | def call
FILE: lib/docs/filters/sanctuary/entries.rb
type Docs (line 1) | module Docs
class EntryIndex (line 3) | class EntryIndex
method entries_as_json (line 5) | def entries_as_json
method types_as_json (line 17) | def types_as_json
class Sanctuary (line 30) | class Sanctuary
class EntriesFilter (line 31) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 32) | def additional_entries
FILE: lib/docs/filters/sanctuary_def/clean_html.rb
type Docs (line 1) | module Docs
class SanctuaryDef (line 2) | class SanctuaryDef
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/sanctuary_def/entries.rb
type Docs (line 1) | module Docs
class EntryIndex (line 3) | class EntryIndex
method entries_as_json (line 5) | def entries_as_json
method types_as_json (line 17) | def types_as_json
class SanctuaryDef (line 30) | class SanctuaryDef
class EntriesFilter (line 31) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 33) | def additional_entries
FILE: lib/docs/filters/sanctuary_type_classes/clean_html.rb
type Docs (line 1) | module Docs
class SanctuaryTypeClasses (line 2) | class SanctuaryTypeClasses
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/sanctuary_type_classes/entries.rb
type Docs (line 1) | module Docs
class EntryIndex (line 3) | class EntryIndex
method entries_as_json (line 5) | def entries_as_json
method types_as_json (line 17) | def types_as_json
class SanctuaryTypeClasses (line 30) | class SanctuaryTypeClasses
class EntriesFilter (line 31) | class EntriesFilter < Docs::EntriesFilter
method additional_entries (line 33) | def additional_entries
FILE: lib/docs/filters/sass/clean_html.rb
type Docs (line 1) | module Docs
class Sass (line 2) | class Sass
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/sass/entries.rb
type Docs (line 1) | module Docs
class Sass (line 2) | class Sass
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 9) | def get_type
method additional_entries (line 34) | def additional_entries
FILE: lib/docs/filters/scala/clean_html_v2.rb
type Docs (line 1) | module Docs
class Scala (line 2) | class Scala
class CleanHtmlV2Filter (line 3) | class CleanHtmlV2Filter < Filter
method call (line 4) | def call
method always (line 13) | def always
method add_title (line 87) | def add_title
FILE: lib/docs/filters/scala/clean_html_v3.rb
type Docs (line 3) | module Docs
class Scala (line 4) | class Scala
class CleanHtmlV3Filter (line 5) | class CleanHtmlV3Filter < Filter
method call (line 6) | def call
method format_title (line 30) | def format_title
method format_signature (line 60) | def format_signature
method format_top_links (line 68) | def format_top_links
method format_metadata (line 102) | def format_metadata
method format_members (line 138) | def format_members
method simplify_html (line 205) | def simplify_html
method convert_dl_to_table (line 231) | def convert_dl_to_table(dl)
FILE: lib/docs/filters/scala/entries_v2.rb
type Docs (line 1) | module Docs
class Scala (line 2) | class Scala
class EntriesV2Filter (line 3) | class EntriesV2Filter < Docs::EntriesFilter
method get_name (line 10) | def get_name
method get_type (line 29) | def get_type
method include_default_entry? (line 39) | def include_default_entry?
method additional_entries (line 43) | def additional_entries
method package_name (line 76) | def package_name
method parent_package (line 81) | def parent_package
method package_drop_last (line 86) | def package_drop_last(parts)
method slug_parts (line 90) | def slug_parts
method owner (line 94) | def owner
method is_package? (line 98) | def is_package?
FILE: lib/docs/filters/scala/entries_v3.rb
type Docs (line 3) | module Docs
class Scala (line 4) | class Scala
class EntriesV3Filter (line 5) | class EntriesV3Filter < Docs::EntriesFilter
method get_name (line 12) | def get_name
method get_type (line 30) | def get_type
method include_default_entry? (line 40) | def include_default_entry?
method additional_entries (line 45) | def additional_entries
method package_name (line 82) | def package_name
method parent_package (line 87) | def parent_package
method package_drop_last (line 92) | def package_drop_last(parts)
method slug_parts (line 96) | def slug_parts
method is_package? (line 100) | def is_package?
FILE: lib/docs/filters/scikit_image/entries.rb
type Docs (line 1) | module Docs
class ScikitImage (line 2) | class ScikitImage
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 18) | def get_type
method additional_entries (line 26) | def additional_entries
method include_default_entry? (line 48) | def include_default_entry?
FILE: lib/docs/filters/scikit_learn/clean_html.rb
type Docs (line 1) | module Docs
class ScikitLearn (line 2) | class ScikitLearn
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/scikit_learn/entries.rb
type Docs (line 1) | module Docs
class ScikitLearn (line 2) | class ScikitLearn
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 24) | def get_type
method additional_entries (line 41) | def additional_entries
FILE: lib/docs/filters/sequelize/clean_html.rb
type Docs (line 1) | module Docs
class Sequelize (line 2) | class Sequelize
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/sequelize/entries.rb
type Docs (line 1) | module Docs
class Sequelize (line 2) | class Sequelize
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 5) | def get_name
method get_type (line 10) | def get_type
method include_default_entry? (line 32) | def include_default_entry?
FILE: lib/docs/filters/sinon/clean_html.rb
type Docs (line 1) | module Docs
class Sinon (line 2) | class Sinon
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/sinon/entries.rb
type Docs (line 1) | module Docs
class Sinon (line 2) | class Sinon
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 12) | def additional_entries
FILE: lib/docs/filters/socketio/clean_html.rb
type Docs (line 1) | module Docs
class Socketio (line 2) | class Socketio
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/socketio/entries.rb
type Docs (line 1) | module Docs
class Socketio (line 2) | class Socketio
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 4) | def get_name
method get_type (line 8) | def get_type
method additional_entries (line 16) | def additional_entries
FILE: lib/docs/filters/sphinx/clean_html.rb
type Docs (line 1) | module Docs
class Sphinx (line 2) | class Sphinx
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/spring_boot/clean_html.rb
type Docs (line 1) | module Docs
class SpringBoot (line 2) | class SpringBoot
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/spring_boot/entries.rb
type Docs (line 1) | module Docs
class SpringBoot (line 2) | class SpringBoot
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_type (line 5) | def get_type
method additional_entries (line 9) | def additional_entries
FILE: lib/docs/filters/sqlite/clean_html.rb
type Docs (line 1) | module Docs
class Sqlite (line 2) | class Sqlite
class CleanHtmlFilter (line 3) | class CleanHtmlFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/sqlite/clean_js_tables.rb
type Docs (line 1) | module Docs
class Sqlite (line 2) | class Sqlite
class CleanJsTablesFilter (line 3) | class CleanJsTablesFilter < Filter
method call (line 4) | def call
FILE: lib/docs/filters/sqlite/entries.rb
type Docs (line 1) | module Docs
class Sqlite (line 2) | class Sqlite
class EntriesFilter (line 3) | class EntriesFilter < Docs::EntriesFilter
method get_name (line 6) | def get_name
method get_type (line 41) | def get_type
method additional_entries (line 57) | def additional_entries
Condensed preview — 1340 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,414K chars).
[
{
"path": ".dockerignore",
"chars": 64,
"preview": ".git\ntest\nDockerfile*\n.gitignore\n.dockerignore\n.travis.yml\n*.md\n"
},
{
"path": ".editorconfig",
"chars": 171,
"preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespa"
},
{
"path": ".github/CODEOWNERS",
"chars": 189,
"preview": "# This controls who gets notified for review and allows branches to be protected.\n# Protected branches can only be merge"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 5831,
"preview": "# Contributing to DevDocs\n\nWant to contribute? Great. Please review the following guidelines carefully and search for ex"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 746,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve DevDocs\ntitle: ''\nlabels: 'bug'\nassignees: ''\n---\n\n<!--\nI"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 304,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Question\n about: \"Ask questions and have discussions on Discord\""
},
{
"path": ".github/ISSUE_TEMPLATE/documentation_bug.md",
"chars": 574,
"preview": "---\nname: Documentation bug\nabout: Report a problem with a specific documentation\ntitle: ''\nlabels: 'docs/improvement'\na"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 724,
"preview": "---\nname: Feature request\nabout: Suggest a new feature\ntitle: ''\nlabels: 'feature'\nassignees: ''\n---\n\n<!--\nIf possible f"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1820,
"preview": "<!-- Remove the sections that don't apply to your PR. -->\n\n<!-- Replace the `[ ]` with a `[x]` in checklists once you’ve"
},
{
"path": ".github/no-response.yml",
"chars": 408,
"preview": "daysUntilClose: 30\nresponseRequiredLabel: needs-info\ncloseComment: >\n This issue has been automatically closed because "
},
{
"path": ".github/workflows/build.yml",
"chars": 1024,
"preview": "name: Deploy\n\non:\n push:\n branches:\n - main\n\njobs:\n deploy:\n name: Deploy to Heroku\n runs-on: ubuntu-24."
},
{
"path": ".github/workflows/docker-build.yml",
"chars": 1672,
"preview": "name: Build and Push Docker Images\non:\n schedule:\n - cron: '0 0 1 * *' # Run monthly on the 1st\n workflow_dispatch"
},
{
"path": ".github/workflows/schedule-doc-report.yml",
"chars": 625,
"preview": "name: Generate documentation versions report\non:\n schedule:\n - cron: '17 4 1 * *'\n workflow_dispatch:\n\njobs:\n repo"
},
{
"path": ".github/workflows/test.yml",
"chars": 455,
"preview": "name: Ruby tests\n\non:\n pull_request:\n branches:\n - main\n\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n "
},
{
"path": ".gitignore",
"chars": 216,
"preview": ".DS_Store\n.bundle\nlog\ntmp\npublic/assets\npublic/fonts\npublic/docs/**/*\ndocs/**/*\n!docs/*.md\n/vendor\n*.tar\n*.tar.bz2\n*.tar"
},
{
"path": ".image_optim.yml",
"chars": 343,
"preview": "verbose: false\nskip_missing_workers: true\nallow_lossy: true\nthreads: 1\nadvpng: false\ngifsicle:\n interlace: false\n leve"
},
{
"path": ".ruby-version",
"chars": 6,
"preview": "3.4.8\n"
},
{
"path": ".slugignore",
"chars": 5,
"preview": "test\n"
},
{
"path": ".tool-versions",
"chars": 11,
"preview": "ruby 3.4.8\n"
},
{
"path": "COPYRIGHT",
"chars": 648,
"preview": "Copyright 2013-2026 Thibaut Courouble and other contributors\n\n This Source Code Form is subject to the terms of the Moz"
},
{
"path": "Dockerfile",
"chars": 525,
"preview": "FROM ruby:3.4.7\nENV LANG=C.UTF-8\nENV ENABLE_SERVICE_WORKER=true\n\nWORKDIR /devdocs\n\nRUN apt-get update && \\\n apt-get -"
},
{
"path": "Dockerfile-alpine",
"chars": 583,
"preview": "FROM ruby:3.4.7-alpine\n\nENV LANG=C.UTF-8\nENV ENABLE_SERVICE_WORKER=true\n\nWORKDIR /devdocs\n\nCOPY . /devdocs\n\nRUN apk --up"
},
{
"path": "Gemfile",
"chars": 956,
"preview": "source 'https://rubygems.org'\nruby '3.4.8'\n\ngem 'activesupport', require: false\ngem 'html-pipeline'\ngem 'nokogiri'\ngem '"
},
{
"path": "LICENSE",
"chars": 16725,
"preview": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\""
},
{
"path": "Procfile",
"chars": 43,
"preview": "web: bundle exec rackup config.ru -p $PORT\n"
},
{
"path": "README.md",
"chars": 19475,
"preview": "# [DevDocs](https://devdocs.io) — API Documentation Browser\n\nDevDocs combines multiple developer documentations in a cle"
},
{
"path": "Rakefile",
"chars": 440,
"preview": "#!/usr/bin/env rake\n\nrequire 'bundler/setup'\nrequire 'thor'\n\nBundler.require :default\n$LOAD_PATH.unshift 'lib'\n\ntask :de"
},
{
"path": "Thorfile",
"chars": 25,
"preview": "$LOAD_PATH.unshift 'lib'\n"
},
{
"path": "assets/images/.gitignore",
"chars": 13,
"preview": "sprites/**/*\n"
},
{
"path": "assets/javascripts/app/app.js",
"chars": 10822,
"preview": "class App extends Events {\n _$ = $;\n _$$ = $$;\n _page = page;\n collections = {};\n models = {};\n templates = {};\n "
},
{
"path": "assets/javascripts/app/config.js.erb",
"chars": 760,
"preview": "app.config = {\n db_filename: 'db.json',\n default_docs: <%= App.default_docs.to_json %>,\n docs_aliases: <%= App.docs_a"
},
{
"path": "assets/javascripts/app/db.js",
"chars": 12505,
"preview": "app.DB = class DB {\n static NAME = \"docs\";\n static VERSION = 15;\n\n constructor() {\n this.versionMultipler = $.isIE"
},
{
"path": "assets/javascripts/app/router.js",
"chars": 4467,
"preview": "app.Router = class Router extends Events {\n static routes = [\n [\"*\", \"before\"],\n [\"/\", \"root\"],\n [\"/settings\","
},
{
"path": "assets/javascripts/app/searcher.js",
"chars": 9255,
"preview": "//\n// Match functions\n//\n\nlet fuzzyRegexp,\n i,\n index,\n lastIndex,\n match,\n matcher,\n matchIndex,\n matchLength,\n "
},
{
"path": "assets/javascripts/app/serviceworker.js",
"chars": 1760,
"preview": "app.ServiceWorker = class ServiceWorker extends Events {\n static isEnabled() {\n return !!navigator.serviceWorker && "
},
{
"path": "assets/javascripts/app/settings.js",
"chars": 4726,
"preview": "app.Settings = class Settings {\n static PREFERENCE_KEYS = [\n \"hideDisabled\",\n \"hideIntro\",\n \"manualUpdate\",\n "
},
{
"path": "assets/javascripts/app/shortcuts.js",
"chars": 6595,
"preview": "app.Shortcuts = class Shortcuts extends Events {\n constructor() {\n super();\n this.onKeydown = this.onKeydown.bind"
},
{
"path": "assets/javascripts/app/update_checker.js",
"chars": 1209,
"preview": "app.UpdateChecker = class UpdateChecker {\n constructor() {\n this.lastCheck = Date.now();\n\n $.on(window, \"focus\", "
},
{
"path": "assets/javascripts/application.js",
"chars": 644,
"preview": "//= require_tree ./vendor\n\n//= require lib/license\n//= require_tree ./lib\n\n//= require app/app\n//= require app/config\n//"
},
{
"path": "assets/javascripts/collections/collection.js",
"chars": 1457,
"preview": "app.Collection = class Collection {\n constructor(objects) {\n if (objects == null) {\n objects = [];\n }\n th"
},
{
"path": "assets/javascripts/collections/docs.js",
"chars": 2792,
"preview": "app.collections.Docs = class Docs extends app.Collection {\n static model = \"Doc\";\n static NORMALIZE_VERSION_RGX = /\\.("
},
{
"path": "assets/javascripts/collections/entries.js",
"chars": 94,
"preview": "app.collections.Entries = class Entries extends app.Collection {\n static model = \"Entry\";\n};\n"
},
{
"path": "assets/javascripts/collections/types.js",
"chars": 658,
"preview": "app.collections.Types = class Types extends app.Collection {\n static model = \"Type\";\n static GUIDES_RGX =\n /(^|\\()("
},
{
"path": "assets/javascripts/debug.js",
"chars": 2113,
"preview": "//\n// App\n//\n\nconst _init = app.init;\napp.init = function () {\n console.time(\"Init\");\n _init.call(app);\n console.time"
},
{
"path": "assets/javascripts/docs.js.erb",
"chars": 76,
"preview": "//= depend_on docs.json\napp.DOCS = <%= File.read App.docs_manifest_path %>;\n"
},
{
"path": "assets/javascripts/lib/ajax.js",
"chars": 3529,
"preview": "const MIME_TYPES = {\n json: \"application/json\",\n html: \"text/html\",\n};\n\nfunction ajax(options) {\n applyDefaults(optio"
},
{
"path": "assets/javascripts/lib/cookies_store.js",
"chars": 1420,
"preview": "// Intentionally called CookiesStore instead of CookieStore\n// Calling it CookieStore causes issues when the Experimenta"
},
{
"path": "assets/javascripts/lib/events.js",
"chars": 1339,
"preview": "class Events {\n on(event, callback) {\n if (event.includes(\" \")) {\n for (var name of event.split(\" \")) {\n "
},
{
"path": "assets/javascripts/lib/favicon.js",
"chars": 2529,
"preview": "let defaultUrl = null;\nlet currentSlug = null;\n\nconst imageCache = {};\nconst urlCache = {};\n\nconst withImage = function "
},
{
"path": "assets/javascripts/lib/license.js",
"chars": 231,
"preview": "/*\n * Copyright 2013-2026 Thibaut Courouble and other contributors\n *\n * This source code is licensed under the terms of"
},
{
"path": "assets/javascripts/lib/local_storage_store.js",
"chars": 492,
"preview": "this.LocalStorageStore = class LocalStorageStore {\n get(key) {\n try {\n return JSON.parse(localStorage.getItem(k"
},
{
"path": "assets/javascripts/lib/page.js",
"chars": 7897,
"preview": "/*\n * Based on github.com/visionmedia/page.js\n * Licensed under the MIT license\n * Copyright 2012 TJ Holowaychuk <tj@vis"
},
{
"path": "assets/javascripts/lib/util.js",
"chars": 12021,
"preview": "//\n// Traversing\n//\n\nlet smoothDistance, smoothDuration, smoothEnd, smoothStart;\nthis.$ = function (selector, el) {\n if"
},
{
"path": "assets/javascripts/models/doc.js",
"chars": 4098,
"preview": "app.models.Doc = class Doc extends app.Model {\n // Attributes: name, slug, type, version, release, db_size, mtime, link"
},
{
"path": "assets/javascripts/models/entry.js",
"chars": 1573,
"preview": "//= require app/searcher\n\napp.models.Entry = class Entry extends app.Model {\n static applyAliases(string) {\n const a"
},
{
"path": "assets/javascripts/models/model.js",
"chars": 161,
"preview": "app.Model = class Model {\n constructor(attributes) {\n for (var key in attributes) {\n var value = attributes[key"
},
{
"path": "assets/javascripts/models/type.js",
"chars": 395,
"preview": "app.models.Type = class Type extends app.Model {\n // Attributes: name, slug, count\n\n fullPath() {\n return `/${this."
},
{
"path": "assets/javascripts/news.json",
"chars": 20711,
"preview": "[\n [\n \"2026-02-14\",\n \"New documentation: <a href=\\\"/couchdb/\\\">CouchDB</a>\"\n ],\n [\n \"2025-10-19\",\n \"New d"
},
{
"path": "assets/javascripts/templates/base.js",
"chars": 366,
"preview": "app.templates.render = function (name, value, ...args) {\n const template = app.templates[name];\n\n if (Array.isArray(va"
},
{
"path": "assets/javascripts/templates/error_tmpl.js",
"chars": 3960,
"preview": "const error = function (title, text, links) {\n if (text == null) {\n text = \"\";\n }\n if (links == null) {\n links "
},
{
"path": "assets/javascripts/templates/notice_tmpl.js",
"chars": 500,
"preview": "const notice = (text) => `<p class=\"_notice-text\">${text}</p>`;\n\napp.templates.singleDocNotice = (doc) =>\n notice(` You"
},
{
"path": "assets/javascripts/templates/notif_tmpl.js",
"chars": 3917,
"preview": "const notif = function (title, html) {\n html = html.replace(/<a /g, '<a class=\"_notif-link\" ');\n return ` <h5 class=\"_"
},
{
"path": "assets/javascripts/templates/pages/about_tmpl.js",
"chars": 5512,
"preview": "app.templates.aboutPage = function () {\n let doc;\n const all_docs = app.docs.all().concat(...(app.disabledDocs.all() |"
},
{
"path": "assets/javascripts/templates/pages/help_tmpl.js",
"chars": 7953,
"preview": "app.templates.helpPage = function () {\n const ctrlKey = $.isMac() ? \"cmd\" : \"ctrl\";\n const navKey = $.isMac() ? \"cmd\" "
},
{
"path": "assets/javascripts/templates/pages/news_tmpl.js.erb",
"chars": 1423,
"preview": "//= depend_on news.json\n\napp.templates.newsPage = () => ` <h1 class=\"_lined-heading\">Changelog</h1>\n<p class=\"_note\">\nFo"
},
{
"path": "assets/javascripts/templates/pages/offline_tmpl.js",
"chars": 3994,
"preview": "app.templates.offlinePage = (docs) => `\\\n<h1 class=\"_lined-heading\">Offline Documentation</h1>\n\n<div class=\"_docs-tools\""
},
{
"path": "assets/javascripts/templates/pages/root_tmpl.js.erb",
"chars": 4543,
"preview": "app.templates.splash = \"<div class=\\\"_splash-title\\\">DevDocs</div>\";\n\n<% if App.development? %>\napp.templates.intro = `\\"
},
{
"path": "assets/javascripts/templates/pages/settings_tmpl.js",
"chars": 4931,
"preview": "const themeOption = ({ label, value }, settings) => `\\\n<label class=\"_settings-label _theme-label\">\n <input type=\"radio"
},
{
"path": "assets/javascripts/templates/pages/type_tmpl.js",
"chars": 324,
"preview": "app.templates.typePage = (type) => {\n return ` <h1>${type.doc.fullName} / ${type.name}</h1>\n<ul class=\"_entry-list\">${a"
},
{
"path": "assets/javascripts/templates/path_tmpl.js",
"chars": 474,
"preview": "app.templates.path = function (doc, type, entry) {\n const arrow = '<svg class=\"_path-arrow\"><use xlink:href=\"#icon-dir\""
},
{
"path": "assets/javascripts/templates/sidebar_tmpl.js",
"chars": 4069,
"preview": "const { templates } = app;\n\nconst arrow = '<svg class=\"_list-arrow\"><use xlink:href=\"#icon-dir\"/></svg>';\n\ntemplates.sid"
},
{
"path": "assets/javascripts/templates/tip_tmpl.js",
"chars": 814,
"preview": "app.templates.tipKeyNav = () => `\\\n<p class=\"_notif-text\">\n <strong>ProTip</strong>\n <span class=\"_notif-info\">(click "
},
{
"path": "assets/javascripts/tracking.js",
"chars": 1713,
"preview": "try {\n if (app.config.env === \"production\") {\n if (Cookies.get(\"analyticsConsent\") === \"1\") {\n (function (i, s,"
},
{
"path": "assets/javascripts/vendor/cookies.js",
"chars": 6455,
"preview": "/*\n * Cookies.js - 1.2.3 (patched for SameSite=Strict and secure=true)\n * https://github.com/ScottHamper/Cookies\n *\n * T"
},
{
"path": "assets/javascripts/vendor/mathml.js",
"chars": 1129,
"preview": "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not "
},
{
"path": "assets/javascripts/vendor/prism.js",
"chars": 184213,
"preview": "/* PrismJS 1.30.0\nhttps://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+cpp+cmake+"
},
{
"path": "assets/javascripts/vendor/raven.js",
"chars": 133537,
"preview": "/*! Raven.js 3.20.1 (42adaf5) | github.com/getsentry/raven-js */\n\n/*\n * Includes TraceKit\n * https://github.com/getsentr"
},
{
"path": "assets/javascripts/views/content/content.js",
"chars": 5420,
"preview": "app.views.Content = class Content extends app.View {\n static el = \"._content\";\n static loadingClass = \"_content-loadin"
},
{
"path": "assets/javascripts/views/content/entry_page.js",
"chars": 5358,
"preview": "app.views.EntryPage = class EntryPage extends app.View {\n static className = \"_page\";\n static errorClass = \"_page-erro"
},
{
"path": "assets/javascripts/views/content/offline_page.js",
"chars": 3404,
"preview": "app.views.OfflinePage = class OfflinePage extends app.View {\n static className = \"_static\";\n\n static events = {\n cl"
},
{
"path": "assets/javascripts/views/content/root_page.js",
"chars": 859,
"preview": "app.views.RootPage = class RootPage extends app.View {\n static events = { click: \"onClick\" };\n\n init() {\n if (!this"
},
{
"path": "assets/javascripts/views/content/settings_page.js",
"chars": 3711,
"preview": "app.views.SettingsPage = class SettingsPage extends app.View {\n static className = \"_static\";\n\n static events = {\n "
},
{
"path": "assets/javascripts/views/content/static_page.js",
"chars": 545,
"preview": "app.views.StaticPage = class StaticPage extends app.View {\n static className = \"_static\";\n\n static titles = {\n abou"
},
{
"path": "assets/javascripts/views/content/type_page.js",
"chars": 469,
"preview": "app.views.TypePage = class TypePage extends app.View {\n static className = \"_page\";\n\n deactivate() {\n if (super.dea"
},
{
"path": "assets/javascripts/views/layout/document.js",
"chars": 2823,
"preview": "app.views.Document = class Document extends app.View {\n static el = document;\n\n static events = { visibilitychange: \"o"
},
{
"path": "assets/javascripts/views/layout/menu.js",
"chars": 764,
"preview": "app.views.Menu = class Menu extends app.View {\n static el = \"._menu\";\n static activeClass = \"active\";\n\n static events"
},
{
"path": "assets/javascripts/views/layout/mobile.js",
"chars": 4826,
"preview": "app.views.Mobile = class Mobile extends app.View {\n static className = \"_mobile\";\n\n static elements = {\n body: \"bod"
},
{
"path": "assets/javascripts/views/layout/path.js",
"chars": 1025,
"preview": "app.views.Path = class Path extends app.View {\n static className = \"_path\";\n static attributes = { role: \"complementar"
},
{
"path": "assets/javascripts/views/layout/resizer.js",
"chars": 1621,
"preview": "app.views.Resizer = class Resizer extends app.View {\n static className = \"_resizer\";\n\n static events = {\n dragstart"
},
{
"path": "assets/javascripts/views/layout/settings.js",
"chars": 2235,
"preview": "app.views.Settings = class Settings extends app.View {\n static SIDEBAR_HIDDEN_LAYOUT = \"_sidebar-hidden\";\n\n static el "
},
{
"path": "assets/javascripts/views/list/list_focus.js",
"chars": 4390,
"preview": "app.views.ListFocus = class ListFocus extends app.View {\n static activeClass = \"focus\";\n\n static events = { click: \"on"
},
{
"path": "assets/javascripts/views/list/list_fold.js",
"chars": 2247,
"preview": "app.views.ListFold = class ListFold extends app.View {\n static targetClass = \"_list-dir\";\n static handleClass = \"_list"
},
{
"path": "assets/javascripts/views/list/list_select.js",
"chars": 1097,
"preview": "app.views.ListSelect = class ListSelect extends app.View {\n static activeClass = \"active\";\n\n static events = { click: "
},
{
"path": "assets/javascripts/views/list/paginated_list.js",
"chars": 3176,
"preview": "app.views.PaginatedList = class PaginatedList extends app.View {\n static PER_PAGE = app.config.max_results;\n\n construc"
},
{
"path": "assets/javascripts/views/misc/news.js",
"chars": 901,
"preview": "//= require views/misc/notif\n\napp.views.News = class News extends app.views.Notif {\n static className = \"_notif _notif-"
},
{
"path": "assets/javascripts/views/misc/notice.js",
"chars": 648,
"preview": "app.views.Notice = class Notice extends app.View {\n static className = \"_notice\";\n static attributes = { role: \"alert\""
},
{
"path": "assets/javascripts/views/misc/notif.js",
"chars": 1701,
"preview": "app.views.Notif = class Notif extends app.View {\n static className = \"_notif\";\n static activeClass = \"_in\";\n static a"
},
{
"path": "assets/javascripts/views/misc/tip.js",
"chars": 237,
"preview": "//= require views/misc/notif\n\napp.views.Tip = class Tip extends app.views.Notif {\n static className = \"_notif _notif-ti"
},
{
"path": "assets/javascripts/views/misc/updates.js",
"chars": 1404,
"preview": "//= require views/misc/notif\n\napp.views.Updates = class Updates extends app.views.Notif {\n static className = \"_notif _"
},
{
"path": "assets/javascripts/views/pages/base.js",
"chars": 1790,
"preview": "app.views.BasePage = class BasePage extends app.View {\n constructor(el, entry) {\n super(el);\n this.entry = entry;"
},
{
"path": "assets/javascripts/views/pages/hidden.js",
"chars": 447,
"preview": "app.views.HiddenPage = class HiddenPage extends app.View {\n static events = { click: \"onClick\" };\n\n constructor(el, en"
},
{
"path": "assets/javascripts/views/pages/jquery.js",
"chars": 1999,
"preview": "//= require views/pages/base\n\napp.views.JqueryPage = class JqueryPage extends app.views.BasePage {\n static demoClassNam"
},
{
"path": "assets/javascripts/views/pages/rdoc.js",
"chars": 569,
"preview": "//= require views/pages/base\n\napp.views.RdocPage = class RdocPage extends app.views.BasePage {\n static events = { click"
},
{
"path": "assets/javascripts/views/pages/sqlite.js",
"chars": 560,
"preview": "//= require views/pages/base\n\napp.views.SqlitePage = class SqlitePage extends app.views.BasePage {\n static events = { c"
},
{
"path": "assets/javascripts/views/pages/support_tables.js",
"chars": 417,
"preview": "//= require views/pages/base\n\napp.views.SupportTablesPage = class SupportTablesPage extends (\n app.views.BasePage\n) {\n "
},
{
"path": "assets/javascripts/views/search/search.js",
"chars": 4554,
"preview": "app.views.Search = class Search extends app.View {\n static SEARCH_PARAM = app.config.search_param;\n\n static el = \"._se"
},
{
"path": "assets/javascripts/views/search/search_scope.js",
"chars": 3958,
"preview": "app.views.SearchScope = class SearchScope extends app.View {\n static SEARCH_PARAM = app.config.search_param;\n\n static "
},
{
"path": "assets/javascripts/views/sidebar/doc_list.js",
"chars": 5949,
"preview": "app.views.DocList = class DocList extends app.View {\n static className = \"_list\";\n static attributes = { role: \"naviga"
},
{
"path": "assets/javascripts/views/sidebar/doc_picker.js",
"chars": 3522,
"preview": "app.views.DocPicker = class DocPicker extends app.View {\n static className = \"_list _list-picker\";\n\n static events = {"
},
{
"path": "assets/javascripts/views/sidebar/entry_list.js",
"chars": 485,
"preview": "//= require views/list/paginated_list\n\napp.views.EntryList = class EntryList extends app.views.PaginatedList {\n static "
},
{
"path": "assets/javascripts/views/sidebar/results.js",
"chars": 2061,
"preview": "app.views.Results = class Results extends app.View {\n static className = \"_list\";\n\n static events = { click: \"onClick\""
},
{
"path": "assets/javascripts/views/sidebar/sidebar.js",
"chars": 4271,
"preview": "app.views.Sidebar = class Sidebar extends app.View {\n static el = \"._sidebar\";\n\n static events = {\n focus: \"onFocus"
},
{
"path": "assets/javascripts/views/sidebar/sidebar_hover.js",
"chars": 2192,
"preview": "app.views.SidebarHover = class SidebarHover extends app.View {\n static itemClass = \"_list-hover\";\n\n static events = {\n"
},
{
"path": "assets/javascripts/views/sidebar/type_list.js",
"chars": 1632,
"preview": "app.views.TypeList = class TypeList extends app.View {\n static tagName = \"div\";\n static className = \"_list _list-sub\";"
},
{
"path": "assets/javascripts/views/view.js",
"chars": 5246,
"preview": "app.View = class View extends Events {\n constructor(el) {\n super();\n if (el instanceof HTMLElement) {\n this."
},
{
"path": "assets/stylesheets/application.css.scss",
"chars": 2963,
"preview": "/*!\n * Copyright 2013-2026 Thibaut Courouble and other contributors\n *\n * This source code is licensed under the terms o"
},
{
"path": "assets/stylesheets/components/_app.scss",
"chars": 586,
"preview": "@use 'global/classes';\n\nhtml._booting { background: var(--contentBackground); }\nbody._max-width { background: none; }\nht"
},
{
"path": "assets/stylesheets/components/_content.scss",
"chars": 7664,
"preview": "//\n// Content\n//\n\n@use 'global/base';\n@use 'global/icons';\n@use 'global/mixins' as m;\n@use 'global/classes';\n\n._containe"
},
{
"path": "assets/stylesheets/components/_environment.scss.erb",
"chars": 90,
"preview": "._hide-in-development {\n <%= App.environment != :production ? 'display: none;' : '' %>\n}\n"
},
{
"path": "assets/stylesheets/components/_fail.scss",
"chars": 626,
"preview": "@use 'global/classes';\n\n._fail { // Don't use CSS variables, in case the browser doesn't support them.\n display: block;"
},
{
"path": "assets/stylesheets/components/_header.scss",
"chars": 4184,
"preview": "//\n// Header\n//\n\n@use 'global/icons';\n@use 'global/mixins' as m;\n@use 'global/classes';\n\n._header {\n position: absolute"
},
{
"path": "assets/stylesheets/components/_mobile.scss",
"chars": 2419,
"preview": "//\n// Mobile overrides\n//\n\n._mobile {\n font-size: 100%;\n background: var(--contentBackground);\n\n ._hide-on-mobile { d"
},
{
"path": "assets/stylesheets/components/_notice.scss",
"chars": 586,
"preview": "@use 'global/mixins' as m;\n\n._notice {\n position: absolute;\n z-index: var(--noticeZ);\n bottom: 0;\n left: var(--sideb"
},
{
"path": "assets/stylesheets/components/_notif.scss",
"chars": 2496,
"preview": "@use 'global/classes';\n@use 'global/icons';\n\n._notif, %notif {\n position: absolute;\n z-index: 2;\n top: 1rem;\n right:"
},
{
"path": "assets/stylesheets/components/_page.scss",
"chars": 1763,
"preview": "@use 'global/classes';\n@use 'components/content';\n\n//\n// Page\n//\n\n._page {\n position: relative;\n min-height: calc(100%"
},
{
"path": "assets/stylesheets/components/_path.scss",
"chars": 943,
"preview": "@use 'global/mixins' as m;\n@use 'global/icons';\n\n._path {\n position: absolute;\n z-index: var(--headerZ);\n bottom: 0;\n"
},
{
"path": "assets/stylesheets/components/_prism.scss",
"chars": 1223,
"preview": "html {\n --prismValue: #905;\n --prismText: #5e8e01;\n --prismOperator: #a67f59;\n --prismKeyword: #0070a3;\n --prismFun"
},
{
"path": "assets/stylesheets/components/_settings.scss",
"chars": 2307,
"preview": "//\n// Settings\n//\n\n@use 'global/classes';\n@use 'global/icons';\n\n._settings {\n display: none;\n position: absolute;\n to"
},
{
"path": "assets/stylesheets/components/_sidebar.scss",
"chars": 6940,
"preview": "//\n// Sidebar\n//\n\n@use 'global/classes';\n@use 'global/icons';\n@use 'global/mixins' as m;\n\n._sidebar {\n position: absolu"
},
{
"path": "assets/stylesheets/global/_base.scss",
"chars": 6494,
"preview": "@use 'global/classes';\n@use 'global/mixins' as m;\n@use 'global/variables' as *;\n@use 'global/print';\n\nhtml {\n height: 1"
},
{
"path": "assets/stylesheets/global/_classes.scss",
"chars": 4154,
"preview": "//\n// Utilities\n//\n\n%border-box {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n%user-select-none {\n "
},
{
"path": "assets/stylesheets/global/_icons.scss.erb",
"chars": 1027,
"preview": "<% manifest = JSON.parse(File.read('assets/images/sprites/docs.json')) %>\n\n%svg-icon {\n display: inline-block;\n vertic"
},
{
"path": "assets/stylesheets/global/_mixins.scss",
"chars": 136,
"preview": "//\n// Mixins\n//\n\n@mixin print {\n @media print {\n @content;\n }\n}\n\n@mixin mobile {\n @media (max-width: 800px) {\n "
},
{
"path": "assets/stylesheets/global/_print.scss",
"chars": 972,
"preview": "@use 'global/mixins' as m;\n\n@include m.print {\n ._header, ._sidebar, ._path, ._notif, ._toc, ._pre-clip, ._notice, ._li"
},
{
"path": "assets/stylesheets/global/_variables-dark.scss",
"chars": 1804,
"preview": "@use 'sass:color';\n\nhtml._theme-dark {\n --absolute: white;\n\n --documentBackground: #222;\n --contentBackground: #33373"
},
{
"path": "assets/stylesheets/global/_variables-light.scss",
"chars": 1692,
"preview": "@use 'sass:color';\n\nhtml._theme-default {\n --absolute: black;\n\n --documentBackground: #f3f3f3;\n --contentBackground: "
},
{
"path": "assets/stylesheets/global/_variables.scss",
"chars": 950,
"preview": "@use 'global/variables-light';\n@use 'global/variables-dark';\n\n// Variables needed to style the error message for browser"
},
{
"path": "assets/stylesheets/pages/_angular.scss",
"chars": 1425,
"preview": "@use 'global/base';\n@use 'pages/simple';\n\n._angular {\n @extend %simple;\n\n .pre-title { @extend %pre-heading; }\n\n .bre"
},
{
"path": "assets/stylesheets/pages/_angularjs.scss",
"chars": 907,
"preview": "@use 'global/classes';\n\n._angularjs {\n h2 { @extend %block-heading; }\n\n //\n // Index\n //\n\n .nav-index-section {\n "
},
{
"path": "assets/stylesheets/pages/_apache.scss",
"chars": 126,
"preview": "@use 'pages/simple';\n\n._apache {\n @extend %simple;\n\n .note, .warning { @extend %note; }\n .warning { @extend %note-red"
},
{
"path": "assets/stylesheets/pages/_async.scss",
"chars": 279,
"preview": "@use 'pages/simple';\n\n._async {\n @extend %simple;\n\n h3 > .type-signature {\n float: right;\n color: var(--textColo"
},
{
"path": "assets/stylesheets/pages/_bash.scss",
"chars": 211,
"preview": "@use 'global/classes';\n\n._bash {\n dl > dt > code,\n dl > dt > kbd {\n @extend %block-label, %label-blue;\n }\n\n th[al"
},
{
"path": "assets/stylesheets/pages/_bootstrap.scss",
"chars": 1119,
"preview": "@use 'pages/simple';\n\n._bootstrap {\n @extend %simple;\n\n h4 > code, h5 > code, strong > code { @extend %label; }\n\n h2 "
},
{
"path": "assets/stylesheets/pages/_cakephp.scss",
"chars": 368,
"preview": "@use 'pages/simple';\n\n._cakephp {\n @extend %simple;\n\n h3 > .source { float: right; }\n h3 > a, span.label, span.php-ke"
},
{
"path": "assets/stylesheets/pages/_chef.scss",
"chars": 159,
"preview": "@use 'pages/simple';\n\n._chef {\n @extend %simple;\n\n .note, .warning { @extend %note; }\n .warning { @extend %note, %not"
},
{
"path": "assets/stylesheets/pages/_clojure.scss",
"chars": 221,
"preview": "@use 'global/classes';\n\n._clojure {\n h2:not([id]) { @extend %block-heading; }\n h2[id], h3 { @extend %block-label, %lab"
},
{
"path": "assets/stylesheets/pages/_codeception.scss",
"chars": 168,
"preview": "@use 'pages/simple';\n\n._codeception {\n @extend %simple;\n\n h4 { @extend %block-label; }\n .warning, .alert { @extend %n"
},
{
"path": "assets/stylesheets/pages/_coffeescript.scss",
"chars": 302,
"preview": "@use 'pages/simple';\n\n\n._coffeescript {\n @extend %simple;\n\n // CoffeeScript / JavaScript code blocks\n > .code {\n m"
},
{
"path": "assets/stylesheets/pages/_cordova.scss",
"chars": 197,
"preview": "@use 'pages/simple';\n\n._cordova {\n @extend %simple;\n\n .alert { @extend %note; }\n\n .compat .n { background: pink; }\n "
},
{
"path": "assets/stylesheets/pages/_cppref.scss",
"chars": 1303,
"preview": "@use 'global/base';\n\n._cppref {\n > h2, > h3 { @extend %block-heading; }\n > h4 { @extend %block-label, %label-blue; }\n "
},
{
"path": "assets/stylesheets/pages/_crystal.scss",
"chars": 489,
"preview": "@use 'global/base';\n@use 'pages/simple';\n\n._crystal {\n @extend %simple;\n\n .signature { @extend %code; }\n a.signature,"
},
{
"path": "assets/stylesheets/pages/_cypress.scss",
"chars": 252,
"preview": "@use 'pages/simple';\n\n._cypress {\n @extend %simple;\n\n .note {\n h1 {\n margin-left: inherit\n }\n\n &.danger "
},
{
"path": "assets/stylesheets/pages/_d.scss",
"chars": 366,
"preview": "@use 'global/base';\n\n._d {\n h2 { @extend %block-heading; }\n h3, .d_decl { @extend %block-label, %label-blue; }\n .d_de"
},
{
"path": "assets/stylesheets/pages/_d3.scss",
"chars": 314,
"preview": "@use 'global/classes';\n\n._d3 {\n > h2 { @extend %block-heading; }\n > h3 { @extend %block-label; }\n > h4 { font-size: 1"
},
{
"path": "assets/stylesheets/pages/_dart.scss",
"chars": 215,
"preview": "@use 'pages/simple';\n\n._dart {\n @extend %simple;\n\n dl:not(.dl-horizontal) dt, .multi-line-signature {\n @extend %blo"
},
{
"path": "assets/stylesheets/pages/_dojo.scss",
"chars": 108,
"preview": "@use 'pages/simple';\n\n._dojo {\n @extend %simple;\n\n .jsdoc-inheritance { color: var(--textColorLight); }\n}\n"
},
{
"path": "assets/stylesheets/pages/_drupal.scss",
"chars": 169,
"preview": "@use 'global/classes';\n\n._drupal {\n h3 { @extend %block-heading; }\n .signature { @extend %note, %note-blue; }\n\n span."
},
{
"path": "assets/stylesheets/pages/_eigen3.scss",
"chars": 0,
"preview": ""
},
{
"path": "assets/stylesheets/pages/_elisp.scss",
"chars": 257,
"preview": "@use 'global/classes';\n\n._elisp {\n dl > dt {\n @extend %block-label, %label-blue;\n }\n\n dl[compact] > dt {"
},
{
"path": "assets/stylesheets/pages/_elixir.scss",
"chars": 244,
"preview": "@use 'pages/simple';\n\n._elixir {\n @extend %simple;\n\n .type-detail { margin-bottom: 2em; }\n .type-detail pre { margin-"
},
{
"path": "assets/stylesheets/pages/_ember.scss",
"chars": 315,
"preview": "@use 'pages/simple';\n\n._ember {\n @extend %simple;\n\n .pre-title { @extend %pre-heading; }\n\n h3 > .access {\n float: "
},
{
"path": "assets/stylesheets/pages/_erlang.scss",
"chars": 353,
"preview": "@use 'pages/simple';\n\n._erlang {\n @extend %simple;\n\n h3 > code { display: block; }\n code.code { @extend %label; }\n ."
},
{
"path": "assets/stylesheets/pages/_express.scss",
"chars": 121,
"preview": "@use 'pages/simple';\n\n._express {\n @extend %simple;\n\n .doc-box { @extend %note; }\n .doc-warn { @extend %note-red; }\n}"
},
{
"path": "assets/stylesheets/pages/_fastapi.scss",
"chars": 511,
"preview": "@use 'global/classes';\n\n._fastapi {\n > h2 { @extend %block-heading; }\n > h3 { @extend %block-label, %label-blue; }\n\n "
},
{
"path": "assets/stylesheets/pages/_fluture.scss",
"chars": 99,
"preview": "@use 'pages/simple';\n\n._fluture {\n @extend %simple;\n\n pre > code {\n font-size: inherit;\n }\n}\n"
},
{
"path": "assets/stylesheets/pages/_git.scss",
"chars": 354,
"preview": "@use 'global/classes';\n\n._git {\n padding-left: 1rem;\n\n > h1,\n > h2,\n > .reference-menu,\n > .callout,\n > h1 + .sect"
},
{
"path": "assets/stylesheets/pages/_github.scss",
"chars": 86,
"preview": "@use 'pages/simple';\n\n._github {\n @extend %simple;\n\n h4 { @extend %block-label; }\n}\n"
},
{
"path": "assets/stylesheets/pages/_gnu_make.scss",
"chars": 100,
"preview": "@use 'global/classes';\n\n._gnu_make {\n dl dt {\n @extend %block-label, %label-blue;\n }\n}\n"
},
{
"path": "assets/stylesheets/pages/_gnuplot.scss",
"chars": 95,
"preview": "@use 'pages/simple';\n\n._gnuplot {\n .CENTER {\n text-align: center;\n }\n @extend %simple;\n}\n"
},
{
"path": "assets/stylesheets/pages/_go.scss",
"chars": 184,
"preview": "@use 'pages/simple';\n\n._go {\n @extend %simple;\n\n #short-nav, table.dir { margin-left: -1rem; }\n\n a.source, span[title"
},
{
"path": "assets/stylesheets/pages/_graphite.scss",
"chars": 112,
"preview": "@use 'pages/simple';\n\n._graphite {\n @extend %simple;\n\n dl > dt {\n @extend %block-label, %label-blue;\n }\n}\n"
},
{
"path": "assets/stylesheets/pages/_groovy.scss",
"chars": 349,
"preview": "@use 'global/classes';\n\n._groovy {\n padding-left: 1rem;\n\n h1, h2 { margin-left: -1rem; }\n h2 { @extend %block-heading"
},
{
"path": "assets/stylesheets/pages/_gtk.scss",
"chars": 371,
"preview": "@use 'global/classes';\n\n._gtk {\n padding-left: 1rem;\n\n h1, h2, h3 { margin-left: -1rem; }\n h2 { @extend %block-headin"
},
{
"path": "assets/stylesheets/pages/_hapi.scss",
"chars": 96,
"preview": "@use 'pages/simple';\n\n._hapi {\n @extend %simple;\n\n pre > code {\n font-size: inherit;\n }\n}\n"
},
{
"path": "assets/stylesheets/pages/_haproxy.scss",
"chars": 618,
"preview": "@use 'global/classes';\n\n._haproxy {\n padding-left: 1rem;\n\n h1, h2, h3 { margin-left: -1rem; }\n h2 { @extend %block-he"
},
{
"path": "assets/stylesheets/pages/_haskell.scss",
"chars": 616,
"preview": "@use 'global/base';\n\n._haskell-api {\n > h2 { @extend %block-heading; }\n > h3 { @extend %block-label; }\n h4 { font-siz"
},
{
"path": "assets/stylesheets/pages/_jasmine.scss",
"chars": 138,
"preview": "@use 'global/classes';\n\n._jasmine {\n .subsection-title, h2 { @extend %block-heading; }\n h4 { @extend %block-label,"
},
{
"path": "assets/stylesheets/pages/_jekyll.scss",
"chars": 176,
"preview": "@use 'pages/simple';\n\n._jekyll {\n @extend %simple;\n\n .note.info { @extend %note-blue; }\n .note.warning { @extend %not"
},
{
"path": "assets/stylesheets/pages/_joi.scss",
"chars": 95,
"preview": "@use 'pages/simple';\n\n._joi {\n @extend %simple;\n\n pre > code {\n font-size: inherit;\n }\n}\n"
},
{
"path": "assets/stylesheets/pages/_jq.scss",
"chars": 453,
"preview": "@use 'global/base';\n@use 'pages/simple';\n\n._jq {\n @extend %simple;\n\n .manual-example table {\n\t border: none;\n\n\t & td"
},
{
"path": "assets/stylesheets/pages/_jquery.scss",
"chars": 2173,
"preview": "@use 'global/classes';\n\n._jquery {\n //\n // Index page\n //\n\n h2.entry-title {\n margin: 0 0 1.5rem;\n font-size: "
},
{
"path": "assets/stylesheets/pages/_julia.scss",
"chars": 152,
"preview": "@use 'pages/simple';\n\n._julia {\n @extend %simple;\n\n .footnote { @extend %note; }\n .note { @extend %note; }\n .docstri"
},
{
"path": "assets/stylesheets/pages/_knockout.scss",
"chars": 197,
"preview": "@use 'global/classes';\n\n._knockout {\n > h2 { @extend %block-heading; }\n > h3 { @extend %block-label, %label-blue; }\n "
},
{
"path": "assets/stylesheets/pages/_kotlin.scss",
"chars": 217,
"preview": "@use 'global/classes';\n\n._kotlin {\n h2 { @extend %block-heading; }\n h3 { @extend %block-label, %label-blue; }\n code {"
},
{
"path": "assets/stylesheets/pages/_kubectl.scss",
"chars": 55,
"preview": "@use 'pages/simple';\n\n._kubectl {\n @extend %simple;\n}\n"
},
{
"path": "assets/stylesheets/pages/_kubernetes.scss",
"chars": 58,
"preview": "@use 'pages/simple';\n\n._kubernetes {\n @extend %simple;\n}\n"
},
{
"path": "assets/stylesheets/pages/_laravel.scss",
"chars": 256,
"preview": "@use 'global/classes';\n\n._laravel {\n h2 { @extend %block-heading; }\n h3 { @extend %block-label, %label-blue; }\n h4 { "
},
{
"path": "assets/stylesheets/pages/_liquid.scss",
"chars": 96,
"preview": "@use 'pages/simple';\n\n._liquid {\n @extend %simple;\n\n p.code-label { @extend %pre-heading; }\n}\n"
},
{
"path": "assets/stylesheets/pages/_lit.scss",
"chars": 994,
"preview": "@use 'pages/simple';\n\n._lit {\n @extend %simple;\n\n h4 {\n @extend %block-label, %label-blue;\n }\n\n .view-source {\n "
},
{
"path": "assets/stylesheets/pages/_love.scss",
"chars": 552,
"preview": "@use 'pages/simple';\n\n._love {\n @extend %simple;\n\n .note { @extend %note; }\n .note-green { @extend %note-green; }\n ."
},
{
"path": "assets/stylesheets/pages/_lua.scss",
"chars": 78,
"preview": "@use 'pages/simple';\n\n._lua {\n @extend %simple;\n\n .apii { float: right; }\n}\n"
},
{
"path": "assets/stylesheets/pages/_mariadb.scss",
"chars": 102,
"preview": "@use 'pages/simple';\n\n._mariadb {\n @extend %simple;\n\n .graybox, .product {\n @extend %note;\n }\n}\n"
},
{
"path": "assets/stylesheets/pages/_mdn.scss",
"chars": 4453,
"preview": "@use 'global/classes';\n\n._mdn {\n container-type: inline-size;\n\n .index { // HTML, CSS\n -webkit-columns: 16em;\n "
},
{
"path": "assets/stylesheets/pages/_meteor.scss",
"chars": 596,
"preview": "@use 'pages/simple';\n\n._meteor {\n @extend %simple;\n\n .note, .warning, .subtitle-page { @extend %note; }\n .subtitle-pa"
},
{
"path": "assets/stylesheets/pages/_mkdocs.scss",
"chars": 273,
"preview": "@use 'global/classes';\n\n._mkdocs {\n h2 { @extend %block-heading; }\n h3 { @extend %block-label, %label-blue; }\n h4 { @"
},
{
"path": "assets/stylesheets/pages/_modernizr.scss",
"chars": 202,
"preview": "@use 'global/classes';\n\n._modernizr {\n h2 { @extend %block-heading; }\n h3 { @extend %block-label, %label-blue; }\n h4 "
},
{
"path": "assets/stylesheets/pages/_moment.scss",
"chars": 201,
"preview": "@use 'global/classes';\n\n._moment {\n > h2 { @extend %block-heading; }\n > h3 { @extend %block-label, %label-blue; }\n > "
},
{
"path": "assets/stylesheets/pages/_nginx.scss",
"chars": 192,
"preview": "@use 'global/classes';\n\n._nginx {\n h4 { @extend %block-heading; }\n .note { @extend %note; }\n .directive { margin: 2.5"
},
{
"path": "assets/stylesheets/pages/_node.scss",
"chars": 832,
"preview": "@use 'global/classes';\n\n._node {\n // https://nodejs.org/api/documentation.html#stability-index\n .api_stability { clear"
},
{
"path": "assets/stylesheets/pages/_npm.scss",
"chars": 253,
"preview": "@use 'pages/simple';\n\n._npm {\n @extend %simple;\n\n .pageColumns {\n padding-left: 0;\n list-style: none;\n }\n\n .fa"
}
]
// ... and 1140 more files (download for full content)
About this extraction
This page contains the full source code of the freeCodeCamp/devdocs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1340 files (2.1 MB), approximately 622.4k tokens, and a symbol index with 4675 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.