diff --git a/Dockerfile b/Dockerfile
index f59628c7..b033427a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,7 +6,7 @@ ENV ENABLE_SERVICE_WORKER=true
WORKDIR /devdocs
RUN apt-get update && \
- apt-get -y install git nodejs && \
+ apt-get -y install git nodejs libcurl4 && \
gem install bundler && \
rm -rf /var/lib/apt/lists/*
diff --git a/Dockerfile-alpine b/Dockerfile-alpine
index b916d2b1..33a06b0e 100644
--- a/Dockerfile-alpine
+++ b/Dockerfile-alpine
@@ -7,7 +7,7 @@ WORKDIR /devdocs
COPY . /devdocs
-RUN apk --update add nodejs build-base libstdc++ gzip git zlib-dev && \
+RUN apk --update add nodejs build-base libstdc++ gzip git zlib-dev libcurl && \
gem install bundler && \
bundle install --system --without test && \
thor docs:download --all && \
diff --git a/assets/javascripts/app/app.coffee b/assets/javascripts/app/app.coffee
index 1e230368..b55e552c 100644
--- a/assets/javascripts/app/app.coffee
+++ b/assets/javascripts/app/app.coffee
@@ -78,7 +78,7 @@
.install()
@previousErrorHandler = onerror
window.onerror = @onWindowError.bind(@)
- CookieStore.onBlocked = @onCookieBlocked
+ CookiesStore.onBlocked = @onCookieBlocked
return
bootOne: ->
diff --git a/assets/javascripts/app/config.coffee.erb b/assets/javascripts/app/config.coffee.erb
index dba368e0..a822f7e2 100644
--- a/assets/javascripts/app/config.coffee.erb
+++ b/assets/javascripts/app/config.coffee.erb
@@ -13,5 +13,6 @@ app.config =
version: <%= Time.now.to_i %>
release: <%= Time.now.utc.httpdate.to_json %>
mathml_stylesheet: '<%= App.cdn_origin %>/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' %>
diff --git a/assets/javascripts/app/settings.coffee b/assets/javascripts/app/settings.coffee
index b2734dfe..350a08c0 100644
--- a/assets/javascripts/app/settings.coffee
+++ b/assets/javascripts/app/settings.coffee
@@ -33,7 +33,7 @@ class app.Settings
analyticsConsent: false
constructor: ->
- @store = new CookieStore
+ @store = new CookiesStore
@cache = {}
get: (key) ->
diff --git a/assets/javascripts/lib/cookie_store.coffee b/assets/javascripts/lib/cookies_store.coffee
similarity index 76%
rename from assets/javascripts/lib/cookie_store.coffee
rename to assets/javascripts/lib/cookies_store.coffee
index 3b340571..eaf1bd4f 100644
--- a/assets/javascripts/lib/cookie_store.coffee
+++ b/assets/javascripts/lib/cookies_store.coffee
@@ -1,4 +1,8 @@
-class @CookieStore
+class @CookiesStore
+ # 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
+
INT = /^\d+$/
@onBlocked: ->
diff --git a/assets/javascripts/lib/favicon.coffee b/assets/javascripts/lib/favicon.coffee
new file mode 100644
index 00000000..2f2d9f93
--- /dev/null
+++ b/assets/javascripts/lib/favicon.coffee
@@ -0,0 +1,64 @@
+defaultUrl = null
+currentSlug = null
+
+imageCache = {}
+urlCache = {}
+
+withImage = (url, action) ->
+ if imageCache[url]
+ action(imageCache[url])
+ else
+ img = new Image()
+ img.crossOrigin = 'anonymous'
+ img.src = url
+ img.onload = () =>
+ imageCache[url] = img
+ action(img)
+
+@setFaviconForDoc = (doc) ->
+ return if currentSlug == doc.slug
+
+ favicon = $('link[rel="icon"]')
+
+ if defaultUrl == null
+ defaultUrl = favicon.href
+
+ if urlCache[doc.slug]
+ favicon.href = urlCache[doc.slug]
+ currentSlug = doc.slug
+ return
+
+ styles = window.getComputedStyle($("._icon-#{doc.slug.split('~')[0]}"), ':before')
+
+ bgUrl = app.config.favicon_spritesheet
+ sourceSize = 16
+ sourceX = Math.abs(parseInt(styles['background-position-x'].slice(0, -2)))
+ sourceY = Math.abs(parseInt(styles['background-position-y'].slice(0, -2)))
+
+ withImage(bgUrl, (docImg) ->
+ withImage(defaultUrl, (defaultImg) ->
+ size = defaultImg.width
+
+ canvas = document.createElement('canvas')
+ ctx = canvas.getContext('2d')
+
+ canvas.width = size
+ canvas.height = size
+ ctx.drawImage(defaultImg, 0, 0)
+
+ docIconPercentage = 65
+ destinationCoords = size / 100 * (100 - docIconPercentage)
+ destinationSize = size / 100 * docIconPercentage
+ ctx.drawImage(docImg, sourceX, sourceY, sourceSize, sourceSize, destinationCoords, destinationCoords, destinationSize, destinationSize)
+
+ urlCache[doc.slug] = canvas.toDataURL()
+ favicon.href = urlCache[doc.slug]
+
+ currentSlug = doc.slug
+ )
+ )
+
+@resetFavicon = () ->
+ if defaultUrl != null and currentSlug != null
+ $('link[rel="icon"]').href = defaultUrl
+ currentSlug = null
diff --git a/assets/javascripts/views/content/content.coffee b/assets/javascripts/views/content/content.coffee
index 8c5ba874..4e01733e 100644
--- a/assets/javascripts/views/content/content.coffee
+++ b/assets/javascripts/views/content/content.coffee
@@ -153,6 +153,9 @@ class app.views.Content extends app.View
return
afterRoute: (route, context) =>
+ if route != 'entry' and route != 'type'
+ resetFavicon()
+
switch route
when 'root'
@show @rootPage
diff --git a/assets/javascripts/views/content/entry_page.coffee b/assets/javascripts/views/content/entry_page.coffee
index d11291a3..f6f06511 100644
--- a/assets/javascripts/views/content/entry_page.coffee
+++ b/assets/javascripts/views/content/entry_page.coffee
@@ -40,6 +40,7 @@ class app.views.EntryPage extends app.View
if app.disabledDocs.findBy 'slug', @entry.doc.slug
@hiddenView = new app.views.HiddenPage @el, @entry
+ setFaviconForDoc(@entry.doc)
@delay @polyfillMathML
@trigger 'loaded'
return
diff --git a/assets/javascripts/views/content/type_page.coffee b/assets/javascripts/views/content/type_page.coffee
index 147fa7ed..ef360c14 100644
--- a/assets/javascripts/views/content/type_page.coffee
+++ b/assets/javascripts/views/content/type_page.coffee
@@ -9,6 +9,7 @@ class app.views.TypePage extends app.View
render: (@type) ->
@html @tmpl('typePage', @type)
+ setFaviconForDoc(@type.doc)
return
getTitle: ->
diff --git a/lib/docs/filters/elixir/clean_html.rb b/lib/docs/filters/elixir/clean_html.rb
index 7ff3a86a..cf703389 100644
--- a/lib/docs/filters/elixir/clean_html.rb
+++ b/lib/docs/filters/elixir/clean_html.rb
@@ -57,6 +57,11 @@ module Docs
node.parent.after(node)
end
+ css('.signature').each do |node|
+ non_text_children = node.xpath('node()[not(self::text())]')
+ non_text_children.to_a.reverse.each { |child| node.parent.add_next_sibling(child) }
+ end
+
css('pre').each do |node|
node['data-language'] = 'elixir'
node.content = node.content
diff --git a/lib/docs/filters/homebrew/clean_html.rb b/lib/docs/filters/homebrew/clean_html.rb
index 5bf6aa29..6a81a5c6 100644
--- a/lib/docs/filters/homebrew/clean_html.rb
+++ b/lib/docs/filters/homebrew/clean_html.rb
@@ -4,6 +4,11 @@ module Docs
def call
css('hr')
+ if at_css('h1').nil?
+ title = current_url.normalized_path[1..-1].gsub(/-/, ' ')
+ doc.children.before("
#{title}
")
+ end
+
css('div.highlighter-rouge').each do |node|
lang = node['class'][/language-(\w+)/, 1]
node['data-language'] = lang if lang
diff --git a/lib/docs/filters/homebrew/entries.rb b/lib/docs/filters/homebrew/entries.rb
index 03650ad9..c698cf72 100644
--- a/lib/docs/filters/homebrew/entries.rb
+++ b/lib/docs/filters/homebrew/entries.rb
@@ -2,7 +2,8 @@ module Docs
class Homebrew
class EntriesFilter < Docs::EntriesFilter
def get_name
- name = at_css('h1').content.strip
+ header = at_css('h1')
+ name = header.nil? ? current_url.normalized_path[1..-1].gsub(/-/, ' ') : header.content.strip
name.remove! %r{\(.*}
name
end
@@ -16,6 +17,7 @@ module Docs
Python-for-Formula-Authors
Migrating-A-Formula-To-A-Tap
Rename-A-Formula
+ Building-Against-Non-Homebrew-Dependencies
How-to-Create-and-Maintain-a-Tap
Brew-Test-Bot
Prose-Style-Guidelines)
diff --git a/lib/docs/filters/kotlin/clean_html.rb b/lib/docs/filters/kotlin/clean_html.rb
index 3ea049a3..6343e8ab 100644
--- a/lib/docs/filters/kotlin/clean_html.rb
+++ b/lib/docs/filters/kotlin/clean_html.rb
@@ -46,6 +46,13 @@ module Docs
parent.content = parent.content
parent['data-language'] = 'kotlin'
end
+
+ css('.tags').each do |wrapper|
+ platforms = wrapper.css('.platform:not(.tag-value-Common)').to_a
+ platforms = platforms.map { |node| "#{node.content} (#{node['data-tag-version']})" }
+ platforms = "Platform and version requirements: #{platforms.join ", "}"
+ wrapper.replace(platforms)
+ end
end
end
end
diff --git a/lib/docs/filters/kotlin/entries.rb b/lib/docs/filters/kotlin/entries.rb
index 71f83327..2afb1e86 100644
--- a/lib/docs/filters/kotlin/entries.rb
+++ b/lib/docs/filters/kotlin/entries.rb
@@ -5,7 +5,9 @@ module Docs
if subpath.start_with?('api')
breadcrumbs[1..-1].join('.')
else
- (at_css('h1') || at_css('h2')).content
+ node = (at_css('h1') || at_css('h2'))
+ return node.content unless node.nil?
+ subpath[/\/([a-z0-9_-]+)\./][1..-2].titleize.sub('Faq', 'FAQ')
end
end
diff --git a/lib/docs/filters/pandas/entries.rb b/lib/docs/filters/pandas/entries.rb
index 2ef5a42b..badf5e22 100644
--- a/lib/docs/filters/pandas/entries.rb
+++ b/lib/docs/filters/pandas/entries.rb
@@ -2,8 +2,10 @@ module Docs
class Pandas
class EntriesFilter < Docs::EntriesFilter
def get_name
- if subpath.start_with?('generated')
- name = at_css('dt').content.strip
+ if subpath.start_with?('generated') || (subpath.include?('reference') && !subpath.include?('reference/index'))
+ name_node = at_css('dt')
+ name_node = at_css('h1') if name_node.nil?
+ name = name_node.content.strip
name.sub! %r{\(.*}, '()'
name.remove! %r{\s=.*}
name.remove! %r{\A(class(method)?) (pandas\.)?}
@@ -16,7 +18,7 @@ module Docs
end
def get_type
- if subpath.start_with?('generated')
+ if subpath.start_with?('generated') || (subpath.include?('reference') && !subpath.include?('reference/index'))
css('.toctree-l2.current > a').last.content.remove(/\s\(.+?\)/)
else
'Manual'
diff --git a/lib/docs/filters/qt/clean_html.rb b/lib/docs/filters/qt/clean_html.rb
index f8f7ebd0..1772a765 100644
--- a/lib/docs/filters/qt/clean_html.rb
+++ b/lib/docs/filters/qt/clean_html.rb
@@ -8,6 +8,7 @@ module Docs
# QML property/method header
css('.qmlproto').each do |node|
id = node.at_css('tr')['id']
+ id = node.at_css('a')['name'] if id.blank?
node.inner_html = node.at_css('td').inner_html
node.name = 'h3'
node['id'] = id
diff --git a/lib/docs/filters/qt/entries.rb b/lib/docs/filters/qt/entries.rb
index 64d342f1..27cd0a31 100644
--- a/lib/docs/filters/qt/entries.rb
+++ b/lib/docs/filters/qt/entries.rb
@@ -111,6 +111,7 @@ module Docs
css('.qmlproto').each do |node|
title = node.content.strip
id = node.at_css('tr')['id']
+ id = node.at_css('a')['name'] if id.blank?
# Remove options
title.remove!(%r{^\[.*\] })
diff --git a/lib/docs/scrapers/clojure.rb b/lib/docs/scrapers/clojure.rb
index b5785bd3..5de4288e 100644
--- a/lib/docs/scrapers/clojure.rb
+++ b/lib/docs/scrapers/clojure.rb
@@ -13,18 +13,23 @@ module Docs
Licensed under the Eclipse Public License 1.0.
HTML
- version '1.9' do
- self.release = '1.9'
+ version '1.10' do
+ self.release = '1.10 (stable)'
self.base_url = 'https://clojure.github.io/clojure/'
end
+ version '1.9' do
+ self.release = '1.9 (legacy)'
+ self.base_url = 'https://clojure.github.io/clojure/branch-clojure-1.9.0/'
+ end
+
version '1.8' do
- self.release = '1.8'
+ self.release = '1.8 (legacy)'
self.base_url = 'https://clojure.github.io/clojure/branch-clojure-1.8.0/'
end
version '1.7' do
- self.release = '1.7'
+ self.release = '1.7 (legacy)'
self.base_url = 'https://clojure.github.io/clojure/branch-clojure-1.7.0/'
end
diff --git a/lib/docs/scrapers/django.rb b/lib/docs/scrapers/django.rb
index 6d48c6d7..f4996b22 100644
--- a/lib/docs/scrapers/django.rb
+++ b/lib/docs/scrapers/django.rb
@@ -34,18 +34,23 @@ module Docs
Licensed under the BSD License.
HTML
+ version '2.2' do
+ self.release = '2.2.4'
+ self.base_url = 'https://docs.djangoproject.com/en/2.2/'
+ end
+
version '2.1' do
- self.release = '2.1.0'
+ self.release = '2.1.11'
self.base_url = 'https://docs.djangoproject.com/en/2.1/'
end
version '2.0' do
- self.release = '2.0.7'
+ self.release = '2.0.13'
self.base_url = 'https://docs.djangoproject.com/en/2.0/'
end
version '1.11' do
- self.release = '1.11.9'
+ self.release = '1.11.23'
self.base_url = 'https://docs.djangoproject.com/en/1.11/'
end
diff --git a/lib/docs/scrapers/docker.rb b/lib/docs/scrapers/docker.rb
index 3ef60aab..06c3344d 100644
--- a/lib/docs/scrapers/docker.rb
+++ b/lib/docs/scrapers/docker.rb
@@ -15,15 +15,69 @@ module Docs
end
options[:attribution] = <<-HTML
- © 2017 Docker, Inc.
+ © 2019 Docker, Inc.
Licensed under the Apache License, Version 2.0.
Docker and the Docker logo are trademarks or registered trademarks of Docker, Inc. in the United States and/or other countries.
Docker, Inc. and other parties may also have trademark rights in other terms used herein.
HTML
- version '17' do
- self.release = '17.06'
- self.base_url = 'https://docs.docker.com/'
+ version '19' do
+ self.release = '19.03'
+ self.base_url = "https://docs.docker.com/"
+
+ html_filters.push 'docker/entries', 'docker/clean_html'
+
+ options[:container] = '.wrapper .container-fluid .row'
+
+ options[:only_patterns] = [/\Aget-started\//, /\Aengine\//, /\Acompose\//, /\Amachine\//, /\Anotary\//]
+ options[:skip_patterns] = [/\Aengine\/api\/v/, /glossary/, /docker-ee/]
+
+ options[:replace_paths] = {
+ 'install/linux/ubuntu/' => 'install/linux/docker-ce',
+ 'get-started/part1' => 'get-started',
+ 'engine/installation/' => 'install',
+ 'engine/installation/linux/linux-postinstall/' => 'install/linux',
+ 'compose/overview/' => 'compose',
+ 'docker-cloud/' => 'docker-hub',
+ 'datacenter/install/linux/' => 'ee',
+ 'engine/userguide/' => 'config/daemon',
+ 'engine/admin/' => 'config/daemon',
+ 'opensource/get-help/' => 'opensource',
+ 'engine/tutorials/dockerimages/' => 'get-started',
+ 'engine/admin/volumes/bind-mounts/' => 'storage',
+ 'engine/tutorials/dockervolumes/' => 'storage',
+ 'engine/admin/volumes/volumes/' => 'storage',
+ 'engine/userguide/labels-custom-metadata/' => 'config',
+ 'engine/userguide/eng-image/multistage-build/' => 'develop/develop-images',
+ 'engine/swarm/networking/' => 'network',
+ 'engine/admin/resource_constraints/' => 'config/containers',
+ 'engine/admin/logging/overview/' => 'config/containers/logging',
+ 'engine/userguide/eng-image/dockerfile_best-practices/' => 'develop/develop-images',
+ 'engine/tutorials/dockerrepos/' => 'get-started',
+ 'engine/userguide/networking/' => 'network',
+ 'engine/userguide/networking/get-started-overlay/' => 'network',
+ 'engine/reference/commandline/swarm_join_token/' => 'engine/reference/commandline',
+ 'engine/understanding-docker/' => 'engine',
+ 'engine/userguide/dockervolumes/' => 'storage',
+ 'engine/installation/binaries/' => 'install/linux/docker-ce',
+ 'engine/userguide/networking/default_network/dockerlinks/' => 'network',
+ 'engine/reference/api/' => 'develop/sdk',
+ 'engine/admin/systemd/' => 'config/daemon',
+ 'engine/userguide/storagedriver/imagesandcontainers/' => 'storage/storagedriver',
+ 'engine/api/' => 'develop/sdk',
+ 'engine/userguide/networking/get-started-overlay' => 'network',
+ 'engine/userguide/networking/overlay-security-model/' => 'network',
+ 'engine/installation/linux/docker-ce/binaries/' => 'install/linux/docker-ce',
+ 'engine/admin/volumes/' => 'storage/volumes/',
+ 'engine/userguide/networking//' => 'network',
+ 'engine/reference/commandline' => 'engine/reference/commandline/docker',
+ 'engine/reference/commandline/' => 'engine/reference/commandline/docker/',
+ }
+ end
+
+ version '18' do
+ self.release = '18.09'
+ self.base_url = "https://docs.docker.com/v#{release}/"
html_filters.push 'docker/entries', 'docker/clean_html'
@@ -33,29 +87,96 @@ module Docs
options[:skip_patterns] = [/\Aengine\/api\/v/, /glossary/, /docker-ee/]
options[:replace_paths] = {
- 'engine/installation/linux/docker-ee/linux-postinstall/' => 'engine/installation/linux/linux-postinstall/',
- 'engine/installation/linux/docker-ee/' => 'engine/installation/',
- 'engine/installation/linux/docker-ce/' => 'engine/installation/',
- 'engine/installation/linux/' => 'engine/installation/',
- 'engine/installation/windows/' => 'engine/installation/',
- 'engine/userguide/intro/' => 'engine/userguide/',
- 'engine/tutorials/dockervolumes/' => 'engine/admin/volumes/volumes/',
- 'engine/getstarted/' => 'get-started/',
- 'engine/tutorials/dockerimages/' => 'get-started/',
- 'engine/tutorials/dockerrepos/' => 'get-started/',
- 'engine/admin/host_integration/' => 'engine/admin/start-containers-automatically/',
- 'engine/installation/linux/rhel/' => 'engine/installation/linux/docker-ee/rhel/',
- 'engine/installation/linux/ubuntulinux/' => 'engine/installation/linux/docker-ee/ubuntu/',
- 'engine/installation/linux/suse/' => 'engine/installation/linux/docker-ee/suse/',
- 'engine/admin/logging/' => 'engine/admin/logging/view_container_logs/',
- 'engine/swarm/how-swarm-mode-works/' => 'engine/swarm/how-swarm-mode-works/nodes/',
- 'engine/installation/binaries/' => 'engine/installation/linux/docker-ce/binaries/',
+ 'install/linux/ubuntu/' => 'install/linux/docker-ce',
+ 'get-started/part1' => 'get-started',
+ 'engine/installation/' => 'install',
+ 'engine/installation/linux/linux-postinstall/' => 'install/linux',
+ 'compose/overview/' => 'compose',
+ 'datacenter/install/linux/' => 'ee',
+ 'engine/userguide/' => 'config/daemon',
+ 'engine/admin/' => 'config/daemon',
+ 'opensource/get-help/' => 'opensource',
+ 'engine/tutorials/dockerimages/' => 'get-started',
+ 'engine/admin/volumes/bind-mounts/' => 'storage',
+ 'engine/tutorials/dockervolumes/' => 'storage',
+ 'engine/admin/volumes/volumes/' => 'storage',
+ 'engine/userguide/labels-custom-metadata/' => 'config',
+ 'engine/reference/api/' => 'develop/sdk',
+ 'engine/userguide/eng-image/multistage-build/' => 'develop/develop-images',
+ 'engine/swarm/networking/' => 'network',
+ 'engine/admin/resource_constraints/' => 'config/containers',
+ 'engine/admin/logging/overview/' => 'config/containers/logging',
+ 'engine/userguide/eng-image/dockerfile_best-practices/' => 'develop/develop-images',
+ 'engine/tutorials/dockerrepos/' => 'get-started',
+ 'engine/userguide/networking/' => 'network',
+ 'engine/userguide/networking/get-started-overlay/' => 'network',
+ 'engine/understanding-docker/' => 'engine',
+ 'engine/reference/commandline/swarm_join_token/' => 'engine/reference/commandline',
+ 'engine/userguide/dockervolumes/' => 'storage',
+ 'engine/admin/systemd/' => 'config/daemon',
+ 'engine/userguide/storagedriver/imagesandcontainers/' => 'storage/storagedriver',
+ 'engine/installation/binaries/' => 'install/linux/docker-ce',
+ 'engine/userguide/networking/default_network/dockerlinks/' => 'network',
+ 'engine/userguide/networking/overlay-security-model/' => 'network',
+ 'engine/userguide/networking/get-started-overlay' => 'network',
+ 'engine/api/' => 'develop/sdk',
+ 'engine/installation/linux/docker-ce/binaries/' => 'install/linux/docker-ce',
+ 'engine/admin/volumes/' => 'storage/volumes/',
+ 'engine/userguide/networking//' => 'network',
+ 'engine/reference/commandline' => 'engine/reference/commandline/docker',
'engine/reference/commandline/' => 'engine/reference/commandline/docker/',
- 'engine/reference/api/' => 'engine/api/',
- 'engine/userguide/dockervolumes/' => 'engine/admin/volumes/volumes/',
- 'engine/understanding-docker/' => 'engine/docker-overview/',
- 'engine/reference/commandline/swarm_join_token/' => 'engine/reference/commandline/swarm_join-token/',
- 'engine/api/getting-started/' => 'engine/api/get-started/',
+ }
+ end
+
+ version '17' do
+ self.release = '17.12'
+ self.base_url = "https://docs.docker.com/v#{release}/"
+
+ html_filters.push 'docker/entries', 'docker/clean_html'
+
+ options[:container] = '.wrapper .container-fluid .row'
+
+ options[:only_patterns] = [/\Aget-started\//, /\Aengine\//, /\Acompose\//, /\Amachine\//, /\Anotary\//]
+ options[:skip_patterns] = [/\Aengine\/api\/v/, /glossary/, /docker-ee/]
+
+ options[:replace_paths] = {
+ 'get-started/part1' => 'get-started',
+ 'engine/installation/' => 'install',
+ 'engine/installation/linux/linux-postinstall/' => 'install/linux',
+ 'opensource/get-help/' => 'opensource',
+ 'engine/admin/volumes/volumes/' => 'storage',
+ 'engine/tutorials/dockerimages/' => 'get-started',
+ 'engine/admin/volumes/bind-mounts/' => 'storage',
+ 'engine/tutorials/dockervolumes/' => 'storage',
+ 'datacenter/install/aws/' => 'docker-for-aws',
+ 'engine/userguide/' => 'config/daemon',
+ 'engine/admin/' => 'config/daemon',
+ 'engine/userguide/labels-custom-metadata/' => 'config',
+ 'engine/userguide/eng-image/multistage-build/' => 'develop/develop-images',
+ 'engine/swarm/networking/' => 'network',
+ 'engine/admin/resource_constraints/' => 'config/containers',
+ 'engine/admin/logging/overview/' => 'config/containers/logging',
+ 'engine/understanding-docker/' => 'engine',
+ 'engine/userguide/eng-image/dockerfile_best-practices/' => 'develop/develop-images',
+ 'engine/tutorials/dockerrepos/' => 'get-started',
+ 'engine/userguide/networking/' => 'network',
+ 'engine/reference/commandline/swarm_join_token/' => 'edge/engine/reference/commandline',
+ 'engine/userguide/networking/get-started-overlay/' => 'network',
+ 'engine/userguide/dockervolumes/' => 'storage',
+ 'engine/installation/binaries/' => 'install/linux/docker-ce',
+ 'engine/userguide/networking/default_network/dockerlinks/' => 'network',
+ 'engine/reference/api/' => 'develop/sdk',
+ 'engine/admin/live-restore/' => 'config/containers',
+ 'engine/api/' => 'develop/sdk',
+ 'engine/userguide/networking/get-started-overlay' => 'network',
+ 'security/security/' => 'engine/security',
+ 'engine/installation/linux/docker-ce/binaries/' => 'install/linux/docker-ce',
+ 'engine/reference/commandline/' => 'edge/engine/reference/commandline',
+ 'engine/admin/systemd/' => 'config/daemon',
+ 'engine/userguide/storagedriver/imagesandcontainers/' => 'storage/storagedriver',
+ 'engine/userguide/networking/overlay-security-model/' => 'network',
+ 'engine/admin/volumes/' => 'storage/volumes/',
+ 'engine/userguide/networking//' => 'network',
}
end
diff --git a/lib/docs/scrapers/elixir.rb b/lib/docs/scrapers/elixir.rb
index a25cca41..f3cc94b2 100644
--- a/lib/docs/scrapers/elixir.rb
+++ b/lib/docs/scrapers/elixir.rb
@@ -33,8 +33,34 @@ module Docs
"https://elixir-lang.org/getting-started/introduction.html" ]
end
+ version '1.9' do
+ self.release = '1.9.1'
+ self.base_urls = [
+ "https://hexdocs.pm/elixir/#{release}/",
+ "https://hexdocs.pm/eex/#{release}/",
+ "https://hexdocs.pm/ex_unit/#{release}/",
+ "https://hexdocs.pm/iex/#{release}/",
+ "https://hexdocs.pm/logger/#{release}/",
+ "https://hexdocs.pm/mix/#{release}/",
+ 'https://elixir-lang.org/getting-started/'
+ ]
+ end
+
+ version '1.8' do
+ self.release = '1.8.2'
+ self.base_urls = [
+ "https://hexdocs.pm/elixir/#{release}/",
+ "https://hexdocs.pm/eex/#{release}/",
+ "https://hexdocs.pm/ex_unit/#{release}/",
+ "https://hexdocs.pm/iex/#{release}/",
+ "https://hexdocs.pm/logger/#{release}/",
+ "https://hexdocs.pm/mix/#{release}/",
+ 'https://elixir-lang.org/getting-started/'
+ ]
+ end
+
version '1.7' do
- self.release = '1.7.3'
+ self.release = '1.7.4'
self.base_urls = [
"https://hexdocs.pm/elixir/#{release}/",
"https://hexdocs.pm/eex/#{release}/",
@@ -47,7 +73,7 @@ module Docs
end
version '1.6' do
- self.release = '1.6.5'
+ self.release = '1.6.6'
self.base_urls = [
"https://hexdocs.pm/elixir/#{release}/",
"https://hexdocs.pm/eex/#{release}/",
diff --git a/lib/docs/scrapers/homebrew.rb b/lib/docs/scrapers/homebrew.rb
index 9dd1581a..5743735f 100644
--- a/lib/docs/scrapers/homebrew.rb
+++ b/lib/docs/scrapers/homebrew.rb
@@ -2,7 +2,7 @@ module Docs
class Homebrew < UrlScraper
self.name = 'Homebrew'
self.type = 'simple'
- self.release = '1.8.1'
+ self.release = '2.1.9'
self.base_url = 'https://docs.brew.sh/'
self.links = {
home: 'https://brew.sh',
diff --git a/lib/docs/scrapers/kotlin.rb b/lib/docs/scrapers/kotlin.rb
index 5055b65e..8707aee5 100644
--- a/lib/docs/scrapers/kotlin.rb
+++ b/lib/docs/scrapers/kotlin.rb
@@ -1,7 +1,7 @@
module Docs
class Kotlin < UrlScraper
self.type = 'kotlin'
- self.release = '1.2.41'
+ self.release = '1.3.41'
self.base_url = 'https://kotlinlang.org/'
self.root_path = 'api/latest/jvm/stdlib/index.html'
self.links = {
@@ -22,10 +22,18 @@ module Docs
docs/events.html
docs/resources.html
docs/reference/grammar.html)
- options[:replace_paths] = { 'api/latest/jvm/stdlib/' => 'api/latest/jvm/stdlib/index.html' }
+ options[:replace_paths] = {
+ 'api/latest/jvm/stdlib/' => 'api/latest/jvm/stdlib/index.html',
+ 'docs/reference/coroutines.html' => 'docs/reference/coroutines-overview.html',
+ 'api/latest/jvm/stdlib/kotlin/fold.html' => 'api/latest/jvm/stdlib/kotlin.collections/fold.html',
+ 'api/latest/jvm/stdlib/kotlin/get-or-else.html' => 'api/latest/jvm/stdlib/kotlin.collections/get-or-else.html',
+ 'api/latest/jvm/stdlib/kotlin/map.html' => 'api/latest/jvm/stdlib/kotlin.collections/map.html',
+ 'docs/tutorials/native/targeting-multiple-platforms.html' => 'docs/tutorials/native/basic-kotlin-native-app.html',
+ 'api/latest/jvm/stdlib/kotlin/-throwable/print-stack-trace.html' => 'api/latest/jvm/stdlib/kotlin/print-stack-trace.html',
+ }
options[:attribution] = <<-HTML
- © 2010–2018 JetBrains s.r.o.
+ © 2010–2019 JetBrains s.r.o.
Licensed under the Apache License, Version 2.0.
HTML
diff --git a/lib/docs/scrapers/padrino.rb b/lib/docs/scrapers/padrino.rb
index d34b7db5..9653bf02 100644
--- a/lib/docs/scrapers/padrino.rb
+++ b/lib/docs/scrapers/padrino.rb
@@ -2,8 +2,8 @@ module Docs
class Padrino < UrlScraper
self.slug = 'padrino'
self.type = 'rubydoc'
- self.release = '0.14.1'
- self.base_url = 'http://www.rubydoc.info/github/padrino/padrino-framework/'
+ self.release = '0.14.4'
+ self.base_url = 'https://www.rubydoc.info/github/padrino/padrino-framework/'
self.root_path = 'file/README.rdoc'
self.initial_paths = %w(index2)
self.links = {
@@ -16,7 +16,7 @@ module Docs
options[:container] = ->(filter) { filter.root_page? ? '#filecontents' : '#content' }
options[:attribution] = <<-HTML
- © 2010–2016 Padrino
+ © 2010–2019 Padrino
Licensed under the MIT License.
HTML
diff --git a/lib/docs/scrapers/pandas.rb b/lib/docs/scrapers/pandas.rb
index a8c2ea51..e333da7f 100644
--- a/lib/docs/scrapers/pandas.rb
+++ b/lib/docs/scrapers/pandas.rb
@@ -14,40 +14,51 @@ module Docs
options[:container] = '.document'
options[:skip] = %w(internals.html release.html contributing.html whatsnew.html)
+ options[:skip_patterns] = [/whatsnew\//]
options[:attribution] = <<-HTML
© 2008–2012, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
HTML
+ version '0.25' do
+ self.release = '0.25.0'
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ end
+
+ version '0.24' do
+ self.release = '0.24.2'
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ end
+
version '0.23' do
self.release = '0.23.4'
- self.base_url = "http://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
end
version '0.22' do
self.release = '0.22.0'
- self.base_url = "http://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
end
version '0.21' do
- self.release = '0.21.0'
- self.base_url = "http://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ self.release = '0.21.1'
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
end
version '0.20' do
self.release = '0.20.3'
- self.base_url = "http://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
end
version '0.19' do
self.release = '0.19.2'
- self.base_url = "http://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
end
version '0.18' do
self.release = '0.18.1'
- self.base_url = "http://pandas.pydata.org/pandas-docs/version/#{self.release}/"
+ self.base_url = "https://pandas.pydata.org/pandas-docs/version/#{self.release}/"
end
def get_latest_version(opts)
diff --git a/lib/docs/scrapers/qt.rb b/lib/docs/scrapers/qt.rb
index a1098b20..4dc2aea0 100644
--- a/lib/docs/scrapers/qt.rb
+++ b/lib/docs/scrapers/qt.rb
@@ -103,9 +103,19 @@ module Docs
Licensed under the GNU Free Documentation License, Version 1.3.
HTML
+ version '5.13' do
+ self.release = '5.13'
+ self.base_url = 'https://doc.qt.io/qt-5.13/'
+ end
+
+ version '5.12' do
+ self.release = '5.12'
+ self.base_url = 'https://doc.qt.io/qt-5.12/'
+ end
+
version '5.11' do
self.release = '5.11'
- self.base_url = 'https://doc.qt.io/qt-5/'
+ self.base_url = 'https://doc.qt.io/archives/qt-5.11/'
end
version '5.9' do
@@ -115,7 +125,7 @@ module Docs
version '5.6' do
self.release = '5.6'
- self.base_url = 'https://doc.qt.io/qt-5.6/'
+ self.base_url = 'https://doc.qt.io/archives/qt-5.6/'
end
def get_latest_version(opts)
diff --git a/lib/tasks/sprites.thor b/lib/tasks/sprites.thor
index ca4e33bf..1c0d3600 100644
--- a/lib/tasks/sprites.thor
+++ b/lib/tasks/sprites.thor
@@ -31,6 +31,8 @@ class SpritesCLI < Thor
item[:dark_icon_fix] = needs_dark_icon_fix(item[:icon_32], bg_color)
end
+ return unless items_with_icons.length > 0
+
log_details(items_with_icons, icons_per_row)
generate_spritesheet(16, items_with_icons, 'assets/images/sprites/docs.png') {|item| item[:icon_16]}
diff --git a/views/service-worker.js.erb b/views/service-worker.js.erb
index 8d5698a7..e64e6355 100644
--- a/views/service-worker.js.erb
+++ b/views/service-worker.js.erb
@@ -35,15 +35,25 @@ self.addEventListener('fetch', event => {
const cachedResponse = await caches.match(event.request);
if (cachedResponse) return cachedResponse;
- const url = new URL(event.request.url);
+ try {
+ const response = await fetch(event.request);
- <%# Attempt to return the index page from the cache if the user is visiting a url like devdocs.io/offline or devdocs.io/javascript/global_objects/array/find %>
- <%# The index page will handle the routing %>
- if (url.origin === location.origin && !url.pathname.includes('.')) {
- const cachedIndex = await caches.match('/');
- if (cachedIndex) return cachedIndex;
- }
+ if (!response.ok) {
+ throw new Error(`The HTTP request failed with status code ${response.status}`);
+ }
+
+ return response;
+ } catch (err) {
+ const url = new URL(event.request.url);
- return fetch(event.request);
+ <%# Attempt to return the index page from the cache if the user is visiting a url like devdocs.io/offline or devdocs.io/javascript/global_objects/array/find %>
+ <%# The index page will make sure the correct documentation or a proper offline page is shown %>
+ if (url.origin === location.origin && !url.pathname.replace(/~([0-9.])+/, '').includes('.')) {
+ const cachedIndex = await caches.match('/');
+ if (cachedIndex) return cachedIndex;
+ }
+
+ throw err;
+ }
})());
});