diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee
index ac86b701..892c4284 100644
--- a/assets/javascripts/templates/pages/about_tmpl.coffee
+++ b/assets/javascripts/templates/pages/about_tmpl.coffee
@@ -211,8 +211,7 @@ credits = [
'2017 Cypress.io',
'MIT',
'https://raw.githubusercontent.com/cypress-io/cypress-documentation/develop/LICENSE.md'
- ],
- [
+ ], [
'D',
'1999-2018 The D Language Foundation',
'Boost',
@@ -572,8 +571,7 @@ credits = [
'2016-2018, The Pony Developers & 2014-2015, Causality Ltd.',
'BSD',
'https://raw.githubusercontent.com/ponylang/ponyc/master/LICENSE'
- ],
- [
+ ], [
'PostgreSQL',
'1996-2018 The PostgreSQL Global Development Group
© 1994 The Regents of the University of California',
'PostgreSQL',
@@ -648,13 +646,17 @@ credits = [
'2010 The Rust Project Developers',
'MIT',
'https://raw.githubusercontent.com/rust-lang/rust/master/LICENSE-MIT'
+ ], [
+ 'RxJS',
+ '2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors',
+ 'Apache',
+ 'https://raw.githubusercontent.com/ReactiveX/rxjs/master/LICENSE.txt'
], [
'Salt Stack',
'2019 SaltStack',
'Apache',
'https://raw.githubusercontent.com/saltstack/salt/develop/LICENSE'
- ],
- [
+ ], [
'Sass',
'2006-2016 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein',
'MIT',
@@ -664,8 +666,7 @@ credits = [
'2002-2019 EPFL, with contributions from Lightbend',
'Apache',
'https://raw.githubusercontent.com/scala/scala-lang/master/license.md'
- ],
- [
+ ], [
'scikit-image',
'2011 the scikit-image team',
'BSD',
@@ -765,8 +766,7 @@ credits = [
'2003-2019 WordPress Foundation',
'GPLv2+',
'https://wordpress.org/about/license/'
- ],
- [
+ ], [
'Yarn',
'2016-present Yarn Contributors',
'BSD',
diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss
index 4374e60c..b16aed59 100644
--- a/assets/stylesheets/application.css.scss
+++ b/assets/stylesheets/application.css.scss
@@ -94,6 +94,7 @@
'pages/rfc',
'pages/rubydoc',
'pages/rust',
+ 'pages/rxjs',
'pages/scala',
'pages/sinon',
'pages/socketio',
diff --git a/assets/stylesheets/pages/_rxjs.scss b/assets/stylesheets/pages/_rxjs.scss
new file mode 100644
index 00000000..15e1252b
--- /dev/null
+++ b/assets/stylesheets/pages/_rxjs.scss
@@ -0,0 +1,24 @@
+._rxjs {
+ @extend %simple;
+
+ .pre-title { @extend %pre-heading; }
+
+ .breadcrumbs { @extend %note; }
+ .banner { @extend %note-green; }
+ code.stable { @extend %label-green; }
+ code.experimental { @extend %label-orange; }
+ code.deprecated { @extend %label-red; }
+ .alert.is-important { @extend %note-red; }
+ .alert.is-helpful, .breadcrumbs { @extend %note-blue; }
+
+ .breadcrumbs { padding-left: 2em; }
+
+ img { margin: 1em 0; }
+
+ .location-badge {
+ font-style: italic;
+ text-align: right;
+ }
+
+ td h3 { margin: 0 !important; }
+}
diff --git a/lib/docs/filters/rxjs/clean_html.rb b/lib/docs/filters/rxjs/clean_html.rb
new file mode 100644
index 00000000..864c201b
--- /dev/null
+++ b/lib/docs/filters/rxjs/clean_html.rb
@@ -0,0 +1,139 @@
+module Docs
+ class Rxjs
+ class CleanHtmlFilter < Filter
+ def call
+ if root_page?
+ css('.card-container').remove
+ at_css('h1').content = 'RxJS Documentation'
+ end
+
+ if at_css('h1').nil?
+ title = subpath.rpartition('/').last.titleize
+ doc.prepend_child("
#{node.inner_html}
"
+ end
+
+ node.remove_attribute('path')
+ node.remove_attribute('region')
+ node.remove_attribute('linenums')
+ node.remove_attribute('title')
+ node.remove_attribute('language')
+ node.remove_attribute('hidecopy')
+ node.remove_attribute('class')
+ end
+
+ css('td > .overloads').each do |node|
+ node.replace node.at_css('.detail-contents')
+ end
+
+ css('td.short-description p').each do |node|
+ signature = node.parent.parent.next_element.at_css('h3[id]')
+ signature.after(node) unless signature.nil?
+ end
+
+ css('.method-table').each do |node|
+ node.replace node.at_css('tbody')
+ end
+
+ css('.api-body > table > caption').each do |node|
+ node.name = 'center'
+ lift_out_of_table node
+ end
+
+ css('.api-body > table > tbody > tr:not([class]) > td > *').each do |node|
+ lift_out_of_table node
+ end
+
+ css('.api-body > table').each do |node|
+ node.remove if node.content.strip.blank?
+ end
+
+ css('h1[class]').remove_attr('class')
+ css('table[class]').remove_attr('class')
+ css('table[width]').remove_attr('width')
+ css('tr[style]').remove_attr('style')
+
+ css('code code').each do |node|
+ node.before(node.children).remove
+ end
+
+ doc
+ end
+
+ def lift_out_of_table(node)
+ table = node.ancestors('table').first
+ table.previous_element.after(node)
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/rxjs/entries.rb b/lib/docs/filters/rxjs/entries.rb
new file mode 100644
index 00000000..c6e488fb
--- /dev/null
+++ b/lib/docs/filters/rxjs/entries.rb
@@ -0,0 +1,29 @@
+module Docs
+ class Rxjs
+ class EntriesFilter < Docs::EntriesFilter
+ def get_name
+ title = at_css('h1')
+ name = title.nil? ? subpath.rpartition('/').last.titleize : title.content
+ name.prepend "#{$1}. " if subpath =~ /\-pt(\d+)/
+ name += '()' unless at_css('.api-type-label.function').nil?
+ name
+ end
+
+ def get_type
+ if slug.start_with?('guide')
+ 'Guide'
+ elsif slug.start_with?('api/')
+ slug.split('/').second
+ else
+ 'Miscellaneous'
+ end
+ end
+
+ def additional_entries
+ css('h3[id]').map do |node|
+ ["#{name}.#{node['name']}()", node['id']]
+ end
+ end
+ end
+ end
+end
diff --git a/lib/docs/scrapers/rxjs.rb b/lib/docs/scrapers/rxjs.rb
new file mode 100644
index 00000000..e5ea1051
--- /dev/null
+++ b/lib/docs/scrapers/rxjs.rb
@@ -0,0 +1,94 @@
+require 'yajl/json_gem'
+
+module Docs
+ class Rxjs < UrlScraper
+ self.name = 'RxJS'
+ self.type = 'rxjs'
+ self.release = '6.5.2'
+ self.base_url = 'https://rxjs.dev/'
+ self.root_path = 'guide/overview'
+ self.links = {
+ home: 'https://rxjs.dev/',
+ code: 'https://github.com/ReactiveX/rxjs'
+ }
+
+ html_filters.push 'rxjs/clean_html', 'rxjs/entries'
+
+ options[:follow_links] = false
+ options[:only_patterns] = [/guide\//, /api\//]
+ options[:skip_patterns] = [/api\/([^\/]+)\.json/]
+ options[:fix_urls_before_parse] = ->(url) do
+ url.sub! %r{\Aguide/}, '/guide/'
+ url.sub! %r{\Aapi/}, '/api/'
+ url.sub! %r{\Agenerated/}, '/generated/'
+ url
+ end
+
+ options[:max_image_size] = 256_000
+
+ options[:attribution] = <<-HTML
+ © 2015–2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors.