From 6939865137694565a45d6e83f21e8bf456f70a69 Mon Sep 17 00:00:00 2001 From: Thibaut Date: Sun, 22 Nov 2015 11:59:43 -0500 Subject: [PATCH] Finish Dojo scraper --- assets/images/icons.png | Bin 35060 -> 35596 bytes assets/images/icons@2x.png | Bin 93182 -> 94618 bytes assets/javascripts/news.json | 3 + .../templates/pages/about_tmpl.coffee | 5 ++ .../javascripts/views/pages/javascript.coffee | 1 + assets/stylesheets/application-dark.css.scss | 1 + assets/stylesheets/application.css.scss | 1 + assets/stylesheets/global/_icons.scss | 1 + assets/stylesheets/pages/_dojo.scss | 6 ++ lib/docs/filters/dojo/clean_html.rb | 38 ++++++++++-- lib/docs/filters/dojo/clean_urls.rb | 10 ++++ lib/docs/filters/dojo/entries.rb | 23 ++++++-- lib/docs/scrapers/dojo.rb | 54 +++++++++--------- public/icons/docs/dojo/16.png | Bin 672 -> 493 bytes public/icons/docs/dojo/16@2x.png | Bin 1698 -> 1208 bytes .../docs/core/scrapers/url_scraper_test.rb | 1 - 16 files changed, 106 insertions(+), 38 deletions(-) create mode 100644 assets/stylesheets/pages/_dojo.scss create mode 100644 lib/docs/filters/dojo/clean_urls.rb diff --git a/assets/images/icons.png b/assets/images/icons.png index fa4b94f9f832c8e88ac7020b79d5c804ff3e89a9..ab0eaf7c6b8fd886845c13f00952f501f632b823 100644 GIT binary patch delta 5822 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 IM6N<$f@CFnxc~qF delta 5282 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 o1=jj4%?Droba;M1& diff --git a/assets/images/icons@2x.png b/assets/images/icons@2x.png index 45385ad25c492048ce2a74658e9e0c8fc785abc5..48e2828abcf1b7c3e6be451b2cfe406ec0ef4f47 100644 GIT binary patch delta 8919 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 delta 7472 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" + ], [ "2015-11-08", "New documentations: Elixir and Vagrant" ], [ diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index 5447df0e..9229442c 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -134,6 +134,11 @@ credits = [ 'Django Software Foundation and individual contributors', 'BSD', 'https://raw.githubusercontent.com/django/django/master/LICENSE' + ], [ + 'Dojo', + '2005-2015 The Dojo Foundation', + 'BSD + AFL', + 'http://dojotoolkit.org/license.html' ], [ 'Drupal', '2001-2015 by the original authors
Drupal is a registered trademark of Dries Buytaert.', diff --git a/assets/javascripts/views/pages/javascript.coffee b/assets/javascripts/views/pages/javascript.coffee index cf8550f7..1658238c 100644 --- a/assets/javascripts/views/pages/javascript.coffee +++ b/assets/javascripts/views/pages/javascript.coffee @@ -33,6 +33,7 @@ app.views.UnderscorePage = app.views.WebpackPage = app.views.JavascriptPage +app.views.DojoPage = app.views.RequirejsPage = app.views.SocketioPage = app.views.VuePage = diff --git a/assets/stylesheets/application-dark.css.scss b/assets/stylesheets/application-dark.css.scss index e77843e1..a0f59963 100644 --- a/assets/stylesheets/application-dark.css.scss +++ b/assets/stylesheets/application-dark.css.scss @@ -37,6 +37,7 @@ 'pages/clojure', 'pages/coffeescript', 'pages/d3', + 'pages/dojo', 'pages/drupal', 'pages/elixir', 'pages/ember', diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index ccb23a53..1fc2326c 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -37,6 +37,7 @@ 'pages/clojure', 'pages/coffeescript', 'pages/d3', + 'pages/dojo', 'pages/drupal', 'pages/elixir', 'pages/ember', diff --git a/assets/stylesheets/global/_icons.scss b/assets/stylesheets/global/_icons.scss index 4939c8b3..0995380f 100644 --- a/assets/stylesheets/global/_icons.scss +++ b/assets/stylesheets/global/_icons.scss @@ -118,3 +118,4 @@ %icon-clipboard-white { background-position: -3rem -9rem; } ._icon-elixir:before { background-position: -4rem -9rem; @extend %darkIconFix !optional; } ._icon-vagrant:before { background-position: -5rem -9rem; } +._icon-dojo:before { background-position: -6rem -9rem; } diff --git a/assets/stylesheets/pages/_dojo.scss b/assets/stylesheets/pages/_dojo.scss new file mode 100644 index 00000000..94f850d1 --- /dev/null +++ b/assets/stylesheets/pages/_dojo.scss @@ -0,0 +1,6 @@ +._dojo { + @extend %simple; + + .functionIcon, .parameters { @extend %code; } + .jsdoc-inheritance { color: $textColorLight; } +} diff --git a/lib/docs/filters/dojo/clean_html.rb b/lib/docs/filters/dojo/clean_html.rb index 0cf2c443..a97f7cd9 100644 --- a/lib/docs/filters/dojo/clean_html.rb +++ b/lib/docs/filters/dojo/clean_html.rb @@ -2,13 +2,41 @@ module Docs class Dojo class CleanHtmlFilter < Filter def call - css('script').remove + if root_page? + doc.inner_html = ' ' + return doc + end + + css('h1[class]').each do |node| + node.remove_attribute('class') + end + + css('.version', '.jsdoc-permalink', '.feedback', '.jsdoc-summary-heading', '.jsdoc-summary-list', '.jsdoc-field.private').remove - css('.version').remove + css('.jsdoc-wrapper, .jsdoc-children, .jsdoc-fields, .jsdoc-field, .jsdoc-property-list, .jsdoc-full-summary, .jsdoc-return-description').each do |node| + node.before(node.children).remove + end + + css('a[name]').each do |node| + next unless node.content.blank? + node.parent['id'] = node['name'] + node.remove + end + + css('div.returnsInfo', 'div.jsdoc-inheritance').each do |node| + node.name = 'p' + end + + css('div.jsdoc-title').each do |node| + node.name = 'h3' + end + + css('.returns').each do |node| + node.inner_html = node.inner_html + ' ' + end - #Remove links which are broken on the methods - doc.css(".functionIcon a").each do |a| - a.replace a.content + css('.functionIcon a').each do |node| + node.replace(node.content) end doc diff --git a/lib/docs/filters/dojo/clean_urls.rb b/lib/docs/filters/dojo/clean_urls.rb new file mode 100644 index 00000000..6c238951 --- /dev/null +++ b/lib/docs/filters/dojo/clean_urls.rb @@ -0,0 +1,10 @@ +module Docs + class Dojo + class CleanUrlsFilter < Filter + def call + html.remove! '?xhr=true' + html + end + end + end +end diff --git a/lib/docs/filters/dojo/entries.rb b/lib/docs/filters/dojo/entries.rb index 01a63be0..9a02e48a 100644 --- a/lib/docs/filters/dojo/entries.rb +++ b/lib/docs/filters/dojo/entries.rb @@ -2,14 +2,27 @@ module Docs class Dojo class EntriesFilter < Docs::EntriesFilter def get_name - at_css('h1').content + at_css('h1').content.remove(/\(.*\)/).remove('dojo/').strip end def get_type - list_of_names = name.split(/\/|\./) - list_of_names.pop - list_of_names.join("/") + path = name.split(/[\/\.\-]/) + path[0] == '_base' ? path[0..1].join('/') : path[0] + end + + def additional_entries + entries = [] + + css('.jsdoc-summary-list li.functionIcon:not(.private):not(.inherited) > a').each do |node| + entries << ["#{self.name}##{node.content}()", node['href'].remove('#')] + end + + css('.jsdoc-summary-list li.objectIcon:not(.private):not(.inherited) > a').each do |node| + entries << ["#{self.name}##{node.content}", node['href'].remove('#')] + end + + entries end end end -end \ No newline at end of file +end diff --git a/lib/docs/scrapers/dojo.rb b/lib/docs/scrapers/dojo.rb index d7ba842c..62157482 100644 --- a/lib/docs/scrapers/dojo.rb +++ b/lib/docs/scrapers/dojo.rb @@ -1,12 +1,12 @@ +require 'yajl/json_gem' + module Docs class Dojo < UrlScraper include StubRootPage - self.name = 'Dojo' - self.slug = 'dojo' + self.type = 'dojo' self.version = '1.10' - self.base_url = 'http://dojotoolkit.org/api/1.10/' - + self.base_url = "http://dojotoolkit.org/api/#{version}/" # Dojo expects all the requests to be xhrs or it redirects you back to the docs home page # where it uses js to call the backend based on the URL so you get the appropriate documentation @@ -16,34 +16,34 @@ module Docs code: 'https://github.com/dojo/dojo' } - html_filters.push 'dojo/clean_html', 'dojo/entries' + html_filters.push 'dojo/entries', 'dojo/clean_html', 'title' + text_filters.push 'dojo/clean_urls' - # Don't use default selector on xhrs as no body or html document exists options[:container] = false + options[:title] = false + options[:root_title] = 'Dojo Toolkit' - def root_page_body - require 'json' - require 'set' - response = Typhoeus::Request.new("dojotoolkit.org/api/1.10/tree.json", - headers: { 'User-Agent' => 'devdocs.io' , 'X-Requested-With' => 'XMLHttpRequest' }).run - treeJSON = JSON.parse(response.response_body) - treeJSON = treeJSON["children"].bsearch { |framework| framework["name"] == "dojo" } - @url_set = Set.new - def get_url_list treeJSON - @url_set.add(self.class.base_url + treeJSON["fullname"] + ".html?xhr=true") - if (treeJSON["children"]) - treeJSON["children"].each do |child| - get_url_list child - end - end - end - get_url_list treeJSON - @url_set.map { |l| "#{l}"}.join "
" - end + options[:only_patterns] = [/\Adojo\//] + options[:skip_patterns] = [/dijit/, /dojox/] options[:attribution] = <<-HTML - The Dojo Toolkit is Copyright © 2005–2013
- Dual licensed under BSD 3-Clause and AFL. + © 2005–2015 The Dojo Foundation
+ Licensed under the AFL 2.1 and BSD 3-Clause licenses. HTML + + private + + def root_page_body + response = request_one("#{self.base_url}tree.json") + json = JSON.parse(response.body) + urls = get_url_list(json) + urls.map { |url| "#{url}" }.join + end + + def get_url_list(json, set = Set.new) + set.add("#{self.class.base_url}#{json['fullname']}.html?xhr=true") + json['children'].each { |child| get_url_list(child, set) } if json['children'] + set + end end end diff --git a/public/icons/docs/dojo/16.png b/public/icons/docs/dojo/16.png index 34695164903ff88c3e34ba77eb1d005fa4607848..09658a31ba059fed1e392e7394daaab3319242d5 100644 GIT binary patch delta 468 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 D$Te>3 delta 1683 zcmV;E25kAb38D>NGYG66=pmolui%YJsR- z$g&FB!Ll+z6edN=C^c=`7^jsOFeZ>H^%vEuPGW7fp=pB_<9}QS=c{C0D4K#xVTohk z_niH(L!A!~QnK^!-simMdERr+J@0u5^ERQ?p?I-2ja5q63jjIWK!N=JAQzD1t2lSuKk84?XkEQvmX2C9i;z@FztMO8yRj zP1@c)&|GERZa2C1jZicohIs&hnHKlfk)~Bw?s#!YxWBgijlO}haJ+Foq;pwWINn$u z?i(lx_t(ya&&oha*s3*Qyro6`hku$f{=eH!m2ZrI-Z`C@BZ_-HKSASRjwG*Nk;&5EHpU)T;3iyD%uq`ArhD4yX2OaLHogJwCJZ_)C})MGHH z1;7RXSliQg2Ee_yb|v-?&NWqyxJ}0^_LA|_08Typy0wlRs{2+D!QcMgRN0vE$58?| z0C>j)ghcw*C2vwo?oOPBa~)XB$;tGGfQINV>whL`r+%D^M|aj-%>6){3rKf90G)tFBC6kATidOX|E4z;eQ0|1&O!6aS<0GvInY|TYl)6mQ!)Edwtd2!q3A!e-53^2Za-4e{i`4n@L(yOTCvA7RZzi-+xO|Idd7erB zlAe$rN5O1dz+2Ny-v-HVArJ-G2gvWsU%vSC(Dkab6`tryGVq!f{$OxNb+*?~g*Iqd zU2FD_3gBJV8S{+1Sd&Pn?Dfoew12=fud2f3V=Sl_=3g_^rz0=cB+_YnJqsRPn(5LYT#W#*tTW~jf%jUoKXWMg zUX2~|by<&3%WGTIiC5yTnd#1l7rhjzEP46jzl%Gjcg&*jzZOlk-6`{RS$~gvUyU6D zvYk+vPlC_{;O$#p?NzC~mizun)5`IgOGU5+%ss%=vDhYRsn3dP z$mW|n<~Mrfgrz%~h!-D-1`G$ibv+TNLOXFLHSNSAv|lj}d^K|5PRDU&;(&nm&owdA z;$ZK)o?!1?&w=^O6YOpD9DnM47dZn-ZgGfCCAYC)k2`49Ei}11Xw|V`k3E^(hMX~d zT6IpeJ~S$zCzS9BcQCSGBHY19of1AFpeH6;9~#ZY)J*5`7Xs%2wONTe?g~ck`g6E~ zkwzuzIG{FXVo$fc7n6d{bHy-SM?hk0!miZw)v@^yJA)V3D2hCBPUG;2IP_fR6~}!r}$!eF2|LeNnw2m(w{+2nRndHpNky;o dnD_Pkzt*`WUE)kc8Vmpc002ovPDHLkV1iq(E+YT{ diff --git a/test/lib/docs/core/scrapers/url_scraper_test.rb b/test/lib/docs/core/scrapers/url_scraper_test.rb index da59c22c..1e599edf 100644 --- a/test/lib/docs/core/scrapers/url_scraper_test.rb +++ b/test/lib/docs/core/scrapers/url_scraper_test.rb @@ -75,7 +75,6 @@ class DocsUrlScraperTest < MiniTest::Spec result end - it "runs a Requester with the given block" do stub(Docs::Requester).run { |*args| @block = args.last } result