diff --git a/assets/images/docs.png b/assets/images/docs.png
index 0eaa66ad..f15d45ab 100644
Binary files a/assets/images/docs.png and b/assets/images/docs.png differ
diff --git a/assets/images/docs@2x.png b/assets/images/docs@2x.png
index baad1b3c..3ca913d2 100644
Binary files a/assets/images/docs@2x.png and b/assets/images/docs@2x.png differ
diff --git a/assets/javascripts/news.json b/assets/javascripts/news.json
index 4226d6ae..6b365355 100644
--- a/assets/javascripts/news.json
+++ b/assets/javascripts/news.json
@@ -1,7 +1,7 @@
[
[
"2016-07-24",
- "New documentations: Julia and Crystal"
+ "New documentations: Julia, Crystal and Redux"
], [
"2016-07-03",
"New documentations: CMake and Matplotlib"
diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee
index 696efe7a..cbf8d811 100644
--- a/assets/javascripts/templates/pages/about_tmpl.coffee
+++ b/assets/javascripts/templates/pages/about_tmpl.coffee
@@ -435,6 +435,11 @@ credits = [
'2009-2016 Salvatore Sanfilippo',
'CC BY-SA',
'https://creativecommons.org/licenses/by-sa/4.0/'
+ ], [
+ 'Redux',
+ '2015-2016 Dan Abramov',
+ 'MIT',
+ 'https://raw.githubusercontent.com/reactjs/redux/master/LICENSE.md'
], [
'RequireJS',
'jQuery Foundation and other contributors',
diff --git a/assets/javascripts/views/pages/simple.coffee b/assets/javascripts/views/pages/simple.coffee
index fbcc2e66..84636982 100644
--- a/assets/javascripts/views/pages/simple.coffee
+++ b/assets/javascripts/views/pages/simple.coffee
@@ -37,6 +37,7 @@ app.views.PhpunitPage =
app.views.PostgresPage =
app.views.RamdaPage =
app.views.ReactPage =
+app.views.ReduxPage =
app.views.RethinkdbPage =
app.views.RubydocPage =
app.views.SinonPage =
diff --git a/assets/stylesheets/global/_icons.scss b/assets/stylesheets/global/_icons.scss
index d9bb1be7..2c04cd87 100644
--- a/assets/stylesheets/global/_icons.scss
+++ b/assets/stylesheets/global/_icons.scss
@@ -132,6 +132,7 @@
._icon-q:before { background-position: -5rem -8rem; }
._icon-crystal:before { background-position: -6rem -8rem; @extend %darkIconFix !optional; }
._icon-julia:before { background-position: -7rem -8rem; @extend %darkIconFix !optional; }
+._icon-redux:before { background-position: -8rem -8rem; @extend %darkIconFix !optional; }
._icon-react_native:before { background-position: 0 -9rem; }
._icon-phalcon:before { background-position: -1rem -9rem; }
._icon-matplotlib:before { background-position: -2rem -9rem; }
diff --git a/assets/stylesheets/pages/_simple.scss b/assets/stylesheets/pages/_simple.scss
index 137d4920..cdb8298d 100644
--- a/assets/stylesheets/pages/_simple.scss
+++ b/assets/stylesheets/pages/_simple.scss
@@ -14,6 +14,7 @@
p > code, li > code { @extend %label; }
blockquote { @extend %note; }
+ blockquote > h4, blockquote > h5 { margin-top: .25rem; }
}
._apache_pig,
@@ -29,6 +30,7 @@
._markdown,
._mocha,
._mongoose,
+._redux,
._sinon,
._typescript,
._webpack {
diff --git a/lib/docs/filters/redux/clean_html.rb b/lib/docs/filters/redux/clean_html.rb
new file mode 100644
index 00000000..7063695b
--- /dev/null
+++ b/lib/docs/filters/redux/clean_html.rb
@@ -0,0 +1,38 @@
+module Docs
+ class Redux
+ class CleanHtmlFilter < Filter
+ def call
+ @doc = at_css('.page-inner > section')
+
+ css('#edit-link', 'hr').remove
+
+ at_css('h2').name = 'h1' unless at_css('h1')
+
+ if root_page?
+ at_css('h1').content = 'Redux'
+
+ at_css('a[href="https://www.npmjs.com/package/redux"]').parent.remove
+
+ css('a[target]').each do |node|
+ node.remove_attribute('target') unless node['href'].start_with?('http')
+ end
+ end
+
+ css('a[id]:empty').each do |node|
+ (node.next_element || node.parent.next_element)['id'] = node['id']
+ end
+
+ css('h1 > code').each do |node|
+ node.before(node.children).remove
+ end
+
+ css('pre > code').each do |node|
+ node.parent['data-language'] = node['class'][/lang-(\w+)/, 1] if node['class']
+ node.parent.content = node.parent.content
+ end
+
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/redux/entries.rb b/lib/docs/filters/redux/entries.rb
new file mode 100644
index 00000000..a7ac89d0
--- /dev/null
+++ b/lib/docs/filters/redux/entries.rb
@@ -0,0 +1,29 @@
+module Docs
+ class Redux
+ class EntriesFilter < Docs::EntriesFilter
+ def get_name
+ name = at_css('.page-inner h1, .page-inner h2').content
+ name.sub! %r{\(.*\)}, '()'
+ name
+ end
+
+ def get_type
+ path = slug.split('/')
+
+ if path.length > 1
+ path[0].titleize.sub('Api', 'API')
+ else
+ 'Miscellaneous'
+ end
+ end
+
+ def additional_entries
+ css('#store-methods + ul > li > a').map do |node|
+ id = node['href'].remove('#')
+ name = "#{self.name}##{id}()"
+ [name, id]
+ end
+ end
+ end
+ end
+end
diff --git a/lib/docs/scrapers/redux.rb b/lib/docs/scrapers/redux.rb
new file mode 100644
index 00000000..2402a5ad
--- /dev/null
+++ b/lib/docs/scrapers/redux.rb
@@ -0,0 +1,24 @@
+module Docs
+ class Redux < UrlScraper
+ self.type = 'redux'
+ self.release = '3.5.2'
+ self.base_url = 'http://redux.js.org/docs/'
+ self.links = {
+ home: 'http://redux.js.org/',
+ code: 'https://github.com/reactjs/redux/'
+ }
+
+ html_filters.push 'redux/entries', 'redux/clean_html'
+
+ options[:skip] = %w(Feedback.html)
+
+ options[:attribution] = <<-HTML
+ © 2015–2016 Dan Abramov
+ Licensed under the MIT License.
+ HTML
+
+ stub '' do
+ request_one('http://redux.js.org/index.html').body
+ end
+ end
+end
diff --git a/public/icons/docs/redux/16.png b/public/icons/docs/redux/16.png
new file mode 100644
index 00000000..a716fa58
Binary files /dev/null and b/public/icons/docs/redux/16.png differ
diff --git a/public/icons/docs/redux/16@2x.png b/public/icons/docs/redux/16@2x.png
new file mode 100644
index 00000000..0aa4f3ac
Binary files /dev/null and b/public/icons/docs/redux/16@2x.png differ
diff --git a/public/icons/docs/redux/SOURCE b/public/icons/docs/redux/SOURCE
new file mode 100644
index 00000000..c63f6d4a
--- /dev/null
+++ b/public/icons/docs/redux/SOURCE
@@ -0,0 +1 @@
+http://redux.js.org/gitbook/images/favicon.ico