* fix ember parsing to handle current guides/docs
Unified · Split
| @@ -273,7 +273,7 @@ credits = [ · 272 unmodified lines | |||
| 273 | 'https://www.gnu.org/licenses/gpl-3.0.html' | 273 | 'https://www.gnu.org/licenses/gpl-3.0.html' |
| 274 | ], [ | 274 | ], [ |
| 275 | 'Ember.js', | 275 | 'Ember.js', |
| 276 | '2017 Yehuda Katz, Tom Dale and Ember.js contributors', | 276 | '2020 Yehuda Katz, Tom Dale and Ember.js contributors', |
| 277 | 'MIT', | 277 | 'MIT', |
| 278 | 'https://raw.githubusercontent.com/emberjs/ember.js/master/LICENSE' | 278 | 'https://raw.githubusercontent.com/emberjs/ember.js/master/LICENSE' |
| 279 | ], [ | 279 | ], [ |
| @@ -2,8 +2,14 @@ module Docs · 1 unmodified line | |||
| 2 | class Ember | 2 | class Ember |
| 3 | class CleanHtmlFilter < Filter | 3 | class CleanHtmlFilter < Filter |
| 4 | def call | 4 | def call |
| 5 | css('hr', '.edit-page').remove | 5 | css('hr', '.edit-page', '.heading__link__edit', 'aside').remove |
| 6 | 6 | ||
| 7 | base_url.host.start_with?('api') ? api : guide | ||
| 8 | |||
| 9 | doc | ||
| 10 | end | ||
| 11 | |||
| 12 | def api | ||
| 7 | # Remove code highlighting | 13 | # Remove code highlighting |
| 8 | css('.highlight').each do |node| | 14 | css('.highlight').each do |node| |
| 9 | node.before(%(<div class="pre-title"><code>#{node.at_css('thead').content.strip}</code></div>)) if node.at_css('thead') | 15 | node.before(%(<div class="pre-title"><code>#{node.at_css('thead').content.strip}</code></div>)) if node.at_css('thead') |
| @@ -13,12 +19,6 @@ module Docs · 3 unmodified lines | |||
| 13 | node['data-language'] = node['data-language'].sub(/(hbs|handlebars)/, 'html') | 19 | node['data-language'] = node['data-language'].sub(/(hbs|handlebars)/, 'html') |
| 14 | end | 20 | end |
| 15 | 21 | ||
| 16 | base_url.path.start_with?('/api') ? api : guide | ||
| 17 | |||
| 18 | doc | ||
| 19 | end | ||
| 20 | |||
| 21 | def api | ||
| 22 | css('h1 .access').each do |node| | 22 | css('h1 .access').each do |node| |
| 23 | node.replace(" (#{node.content})") | 23 | node.replace(" (#{node.content})") |
| 24 | end | 24 | end |
| @@ -72,7 +72,13 @@ module Docs · 47 unmodified lines | |||
| 72 | end | 72 | end |
| 73 | 73 | ||
| 74 | def guide | 74 | def guide |
| 75 | @doc = at_css('article') | 75 | # Remove code highlighting |
| 76 | css('.filename').each do |node| | ||
| 77 | node.content = node.at_css('pre code').content | ||
| 78 | node.name = 'pre' | ||
| 79 | node['data-language'] = node['class'][/(javascript|js|html|hbs|handlebars)/, 1] | ||
| 80 | node['data-language'] = node['data-language'].sub(/(hbs|handlebars)/, 'html') | ||
| 81 | end | ||
| 76 | 82 | ||
| 77 | if root_page? | 83 | if root_page? |
| 78 | at_css('h1').content = 'Ember.js' | 84 | at_css('h1').content = 'Ember.js' |
| @@ -2,60 +2,50 @@ module Docs · 1 unmodified line | |||
| 2 | class Ember | 2 | class Ember |
| 3 | class EntriesFilter < Docs::EntriesFilter | 3 | class EntriesFilter < Docs::EntriesFilter |
| 4 | def get_name | 4 | def get_name |
| 5 | if base_url.path.start_with?('/api') | 5 | name = at_css('h1').content |
| 6 | name = at_css('h1').child.content.strip | 6 | if base_url.host.start_with?('api') |
| 7 | # Remove "Ember." prefix if the next character is uppercase | 7 | name.gsub!('Package', '') |
| 8 | name.sub! %r{\AEmber\.([A-Z])(?!EATURES)}, '\1' | 8 | name.gsub!('Class', '') |
| 9 | name.strip! | ||
| 9 | name << ' (methods)' if subpath.end_with?('/methods') | 10 | name << ' (methods)' if subpath.end_with?('/methods') |
| 10 | name << ' (properties)' if subpath.end_with?('/properties') | 11 | name << ' (properties)' if subpath.end_with?('/properties') |
| 11 | name << ' (events)' if subpath.end_with?('/events') | 12 | name << ' (events)' if subpath.end_with?('/events') |
| 12 | name | ||
| 13 | else | ||
| 14 | name = at_css('article h1').content.remove('Edit Page').strip | ||
| 15 | name = at_css('li.toc-level-0.selected > a').content if name == 'Introduction' | ||
| 16 | name | ||
| 17 | end | 13 | end |
| 14 | name | ||
| 18 | end | 15 | end |
| 19 | 16 | ||
| 20 | def get_type | 17 | def get_type |
| 21 | if base_url.path.start_with?('/api') | 18 | if base_url.host.start_with?('api') |
| 22 | name = self.name.remove(/ \(.*/) | 19 | name = self.name.remove(/ \(.*/) |
| 23 | if name =~ /\A[a-z\-]+\z/ | 20 | if name.start_with?('@') || name == 'rsvp' |
| 24 | 'Modules' | 21 | 'Packages' |
| 25 | elsif name.start_with?('DS') | 22 | elsif name == 'Function' |
| 26 | 'Data' | 23 | 'Functions' |
| 27 | elsif name.start_with?('RSVP') | ||
| 28 | 'RSVP' | ||
| 29 | elsif name.start_with?('Test') | ||
| 30 | 'Test' | ||
| 31 | elsif name.start_with?('Ember') | ||
| 32 | name.split('.')[0..1].join('.') | ||
| 33 | else | 24 | else |
| 34 | name.split('.').first | 25 | 'Classes' |
| 35 | end | 26 | end |
| 36 | else | 27 | else |
| 37 | if node = at_css('li.toc-level-0.selected > a') | 28 | 'Guide' |
| 38 | "Guide: #{node.content.strip}" | ||
| 39 | else | ||
| 40 | 'Guide' | ||
| 41 | end | ||
| 42 | end | 29 | end |
| 43 | end | 30 | end |
| 44 | 31 | ||
| 32 | def include_default_entry? | ||
| 33 | return false if name == 'Function' # these should be included in the corresponding Package page | ||
| 34 | |||
| 35 | super | ||
| 36 | end | ||
| 37 | |||
| 45 | def additional_entries | 38 | def additional_entries |
| 46 | return [] unless base_url.path.start_with?('/api') | 39 | return [] unless base_url.host.start_with?('api') |
| 47 | 40 | ||
| 48 | css('section').each_with_object [] do |node, entries| | 41 | css('section').each_with_object [] do |node, entries| |
| 49 | next unless heading = node.at_css('h3[data-anchor]') | 42 | next unless heading = node.at_css('> h3[data-anchor]') |
| 50 | next if node.at_css('.github-link').content.include?('Inherited') | 43 | |
| 51 | name = heading.at_css('span').content.strip | 44 | name = heading.at_css('span').content.strip |
| 52 | 45 | ||
| 53 | # Give their own type to "Ember.platform", "Ember.run", etc. | 46 | next if name.start_with?('_') # exclude private methods/properties |
| 54 | if self.type != 'Data' && name.include?('.') | ||
| 55 | type = "#{self.name.remove(/ \(.*/)}.#{name.split('.').first}" | ||
| 56 | end | ||
| 57 | 47 | ||
| 58 | name.prepend "#{self.name.remove(/ \(.*/)}." | 48 | name.prepend "#{self.name.remove(/ \(.*/)}." unless self.name == 'Function' |
| 59 | name << '()' if node['class'].include?('method') | 49 | name << '()' if node['class'].include?('method') |
| 60 | name << ' (event)' if node['class'].include?('event') | 50 | name << ' (event)' if node['class'].include?('event') |
| 61 | 51 | ||
| @@ -1,3 +1,5 @@ | |||
| 1 | # frozen_string_literal: true | ||
| 2 | |||
| 1 | module Docs | 3 | module Docs |
| 2 | class Ember < UrlScraper | 4 | class Ember < UrlScraper |
| 3 | include MultipleBaseUrls | 5 | include MultipleBaseUrls |
| @@ -5,11 +7,11 @@ module Docs · 1 unmodified line | |||
| 5 | self.name = 'Ember.js' | 7 | self.name = 'Ember.js' |
| 6 | self.slug = 'ember' | 8 | self.slug = 'ember' |
| 7 | self.type = 'ember' | 9 | self.type = 'ember' |
| 8 | self.release = '2.15.0' | 10 | self.release = '3.25.0' |
| 9 | self.base_urls = [ | 11 | self.base_urls = %w[ |
| 10 | 'https://guides.emberjs.com/v2.15.0/', | 12 | https://guides.emberjs.com/v3.25.0/ |
| 11 | 'https://emberjs.com/api/ember/2.15/', | 13 | https://api.emberjs.com/ember/3.25/ |
| 12 | 'https://emberjs.com/api/ember-data/2.14/' | 14 | https://api.emberjs.com/ember-data/3.25/ |
| 13 | ] | 15 | ] |
| 14 | self.links = { | 16 | self.links = { |
| 15 | home: 'https://emberjs.com/', | 17 | home: 'https://emberjs.com/', |
| @@ -21,10 +23,10 @@ module Docs · 5 unmodified lines | |||
| 21 | options[:trailing_slash] = false | 23 | options[:trailing_slash] = false |
| 22 | 24 | ||
| 23 | options[:container] = ->(filter) do | 25 | options[:container] = ->(filter) do |
| 24 | if filter.base_url.path.start_with?('/api') | 26 | if filter.base_url.host.start_with?('api') |
| 25 | 'main article' | ||
| 26 | else | ||
| 27 | 'main' | 27 | 'main' |
| 28 | else | ||
| 29 | 'main article' | ||
| 28 | end | 30 | end |
| 29 | end | 31 | end |
| 30 | 32 | ||
| @@ -39,26 +41,29 @@ module Docs · 8 unmodified lines | |||
| 39 | options[:skip_patterns] = [ | 41 | options[:skip_patterns] = [ |
| 40 | /\._/, | 42 | /\._/, |
| 41 | /contributing/, | 43 | /contributing/, |
| 42 | /classes\/String/, | 44 | /tutorial/, |
| 43 | /namespaces\/Ember/, | 45 | /js-primer/, |
| 44 | /namespaces\/DS/ | 46 | /in-depth-topics$/, |
| 47 | /managing-dependencies$/ | ||
| 45 | ] | 48 | ] |
| 46 | 49 | ||
| 47 | options[:attribution] = <<-HTML | 50 | options[:attribution] = <<-HTML |
| 48 | © 2017 Yehuda Katz, Tom Dale and Ember.js contributors<br> | 51 | © 2020 Yehuda Katz, Tom Dale and Ember.js contributors<br> |
| 49 | Licensed under the MIT License. | 52 | Licensed under the MIT License. |
| 50 | HTML | 53 | HTML |
| 51 | 54 | ||
| 55 | options[:decode_and_clean_paths] = true # handle paths like @ember/application | ||
| 56 | |||
| 52 | def initial_urls | 57 | def initial_urls |
| 53 | %w( | 58 | %w( |
| 54 | https://guides.emberjs.com/v2.15.0/ | 59 | https://guides.emberjs.com/v3.25.0/ |
| 55 | https://emberjs.com/api/ember/2.15/classes/Ember | 60 | https://api.emberjs.com/ember/3.25/ |
| 56 | https://emberjs.com/api/ember-data/2.14/classes/DS | 61 | https://api.emberjs.com/ember-data/3.25/ |
| 57 | ) | 62 | ) |
| 58 | end | 63 | end |
| 59 | 64 | ||
| 60 | def get_latest_version(opts) | 65 | def get_latest_version(opts) |
| 61 | doc = fetch_doc('https://emberjs.com/api/ember/release', opts) | 66 | doc = fetch_doc('https://api.emberjs.com/ember/release', opts) |
| 62 | doc.at_css('.sidebar > .select-container .ember-power-select-selected-item').content.strip | 67 | doc.at_css('.sidebar > .select-container .ember-power-select-selected-item').content.strip |
| 63 | end | 68 | end |
| 64 | end | 69 | end |