diff --git a/lib/docs/filters/laravel/clean_html.rb b/lib/docs/filters/laravel/clean_html.rb index 42fc17247a..da9d3400dd 100644 --- a/lib/docs/filters/laravel/clean_html.rb +++ b/lib/docs/filters/laravel/clean_html.rb @@ -2,7 +2,7 @@ module Docs class Laravel class CleanHtmlFilter < Filter def call - if subpath.start_with?('/api') + if base_url.origin.start_with?('https://api.laravel.com') api else other diff --git a/lib/docs/filters/laravel/entries.rb b/lib/docs/filters/laravel/entries.rb index 4a083a9bc4..2428a3b708 100644 --- a/lib/docs/filters/laravel/entries.rb +++ b/lib/docs/filters/laravel/entries.rb @@ -1,4 +1,18 @@ module Docs + class EntryIndex + def types_as_json + @types.values + .sort_by { |type| natural_sort_key(type.name) } + .map(&:as_json) + end + + def natural_sort_key(name) + name.downcase.scan(/\d+|\D+/).map do |part| + part.match?(/\A\d+\z/) ? [0, part.to_i] : [1, part] + end + end + end + class Laravel class EntriesFilter < Docs::EntriesFilter def get_name @@ -12,10 +26,28 @@ def get_name end def get_type - unless api_page? - link = at_css(".docs_sidebar li a[href='#{result[:path].split('/').last}']") - heading = link.ancestors('li').last.at_css('> h2') - return heading ? "Guides: #{heading.content.strip}" : 'Guides' + if docs_page? and (version.to_i > 5 or is_version_5) + guide_sections = css(".docs_sidebar > ul > li") + active_link = guide_sections.at_css("li.active a") + + active_section = active_link.ancestors('li.sub--on') + index = guide_sections.index(active_section.first) + + heading = active_section.at_css('> h2') + + return heading ? "Guides: #{index} - #{heading.content.strip}" : 'Guides' + end + + if docs_page? and (version === "4.2") + guide_sections = css(".docs_sidebar > ul > li") + active_link = guide_sections.at_css("ul > li > a[href$='#{result[:path]}']") + + active_section = active_link.ancestors('li') + index = guide_sections.index(active_section.last) + + heading = active_section.at_css('> h2') + + return heading ? "Guides: #{index} - #{heading.content.strip}" : 'Guides' end type = slug.remove(%r{api/[1-9]?\d.[0-9x]/}).remove('Illuminate/').remove(/\/\w+?\z/).gsub('/', '\\') @@ -47,12 +79,20 @@ def additional_entries end def api_page? - subpath.start_with?('/api') + current_url.origin.start_with?('https://api.laravel.com') + end + + def docs_page? + current_url.origin.start_with?('https://laravel.com') end def include_default_entry? !subpath.end_with?('classes.html') end + + def is_version_5 + ["5.0", "5.1", "5.2", "5.3", "5.4", "5.5", "5.6", "5.7", "5.8"].include? version + end end end end diff --git a/lib/docs/scrapers/laravel.rb b/lib/docs/scrapers/laravel.rb index 03872ce062..1654cf814e 100644 --- a/lib/docs/scrapers/laravel.rb +++ b/lib/docs/scrapers/laravel.rb @@ -1,7 +1,8 @@ module Docs class Laravel < UrlScraper + include MultipleBaseUrls + self.type = 'laravel' - self.base_url = 'https://laravel.com' self.links = { home: 'https://laravel.com/', code: 'https://github.com/laravel/laravel' @@ -10,18 +11,17 @@ class Laravel < UrlScraper html_filters.push 'laravel/entries', 'laravel/clean_html' options[:container] = ->(filter) { - filter.subpath.start_with?('/api') ? '#content' : '#docsScreen' + filter.current_url.origin.start_with?('https://api.laravel.com') ? '#content' : '#docsScreen' } - options[:skip_patterns] = [ - %r{\A/api/[1-9]?\d\.[0-9x]/\.html}, - %r{\A/api/[1-9]?\d\.[0-9x]/panel\.html}, - %r{\A/api/[1-9]?\d\.[0-9x]/namespaces\.html}, - %r{\A/api/[1-9]?\d\.[0-9x]/interfaces\.html}, - %r{\A/api/[1-9]?\d\.[0-9x]/traits\.html}, - %r{\A/api/[1-9]?\d\.[0-9x]/doc-index\.html}, - %r{\A/api/[1-9]?\d\.[0-9x]/Illuminate\.html}, - %r{\A/api/[1-9]?\d\.[0-9x]/search\.html} ] + options[:skip] = %w( + namespaces.html + interfaces.html + traits.html + doc-index.html + Illuminate.html + search.html + ) options[:attribution] = <<-HTML © Taylor Otwell
@@ -29,205 +29,184 @@ class Laravel < UrlScraper Laravel is a trademark of Taylor Otwell. HTML - version '11' do - self.release = '11.11.1' - self.root_path = '/api/11.x/index.html' - self.initial_paths = %w(/docs/11.x/installation /api/11.x/classes.html) + def initial_urls + if self.class.version.to_i < 6 + return [ + "https://laravel.com/framework/docs/#{self.class.version}/installation", + ] + end + + return [ + "https://laravel.com/framework/docs/#{self.class.version}.x/installation", + "https://api.laravel.com/docs/#{self.class.version}.x/classes.html" + ] + end - options[:only_patterns] = [%r{\A/api/11\.x/}, %r{\A/docs/11\.x/}] + version '13' do + self.release = '13.37.0' + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] + # Prevent infinite replacement while rewriting from unversioned url to versioned options[:fix_urls] = ->(url) do - url.sub! %r{11.x/+}, "11.x/" - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?![1-9]?\d)}, "#{Laravel.base_url}/docs/11.x/" - url + url.sub( + %r{\Ahttps://laravel\.com/framework/docs/(?!#{version}\.x/)}, + 'https://laravel.com/framework/docs/13.x/' + ) end end - version '10' do - self.release = '10.48.14' - self.root_path = '/api/10.x/index.html' - self.initial_paths = %w(/docs/10.x/installation /api/10.x/classes.html) + version '12' do + self.release = '12.70.0' + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] + end - options[:only_patterns] = [%r{\A/api/10\.x/}, %r{\A/docs/10\.x/}] + version '11' do + self.release = '11.51.0' + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] + end - options[:fix_urls] = ->(url) do - url.sub! %r{10.x/+}, "10.x/" - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?![1-9]?\d)}, "#{Laravel.base_url}/docs/10.x/" - url - end + version '10' do + self.release = '10.48.26' + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] end version '9' do self.release = '9.52.16' - self.root_path = '/api/9.x/index.html' - self.initial_paths = %w(/docs/9.x/installation /api/9.x/classes.html) - - options[:only_patterns] = [%r{\A/api/9\.x/}, %r{\A/docs/9\.x/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{9.x/+}, "9.x/" - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/9.x/" - url - end + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] end version '8' do self.release = '8.83.27' - self.root_path = '/api/8.x/index.html' - self.initial_paths = %w(/docs/8.x/installation /api/8.x/classes.html) - - options[:only_patterns] = [%r{\A/api/8\.x/}, %r{\A/docs/8\.x/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{8.x/+}, "8.x/" - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/8.x/" - url - end + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] end version '7' do self.release = '7.30.6' - self.root_path = '/api/7.x/index.html' - self.initial_paths = %w(/docs/7.x/installation /api/7.x/classes.html) - - options[:only_patterns] = [%r{\A/api/7\.x/}, %r{\A/docs/7\.x/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{7.x/+}, "7.x/" - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/7.x/" - url - end + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] end version '6' do self.release = '6.20.44' - self.root_path = '/api/6.x/index.html' - self.initial_paths = %w(/docs/6.x/installation /api/6.x/classes.html) - - options[:only_patterns] = [%r{\A/api/6\.x/}, %r{\A/docs/6\.x/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{6.x/+}, "6.x/" - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/6.x/" - url - end + self.base_url = "https://api.laravel.com/docs/#{version}.x/index.html" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}.x/", + "https://api.laravel.com/docs/#{version}.x/", + ] end version '5.8' do self.release = '5.8.38' - self.root_path = '/api/5.8/index.html' - self.initial_paths = %w(/docs/5.8/installation /api/5.8/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.8/}, %r{\A/docs/5\.8/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.8/" - url - end + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '5.7' do self.release = '5.7.7' - self.root_path = '/api/5.7/index.html' - self.initial_paths = %w(/docs/5.7/installation /api/5.7/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.7/}, %r{\A/docs/5\.7/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.7/" - url - end + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '5.6' do self.release = '5.6.33' - self.root_path = '/api/5.6/index.html' - self.initial_paths = %w(/docs/5.6/installation /api/5.6/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.6/}, %r{\A/docs/5\.6/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.6/" - url - end + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '5.5' do self.release = '5.5.28' - self.root_path = '/api/5.5/index.html' - self.initial_paths = %w(/docs/5.5/installation /api/5.5/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.5/}, %r{\A/docs/5\.5/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.5/" - url - end + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '5.4' do self.release = '5.4.30' - self.root_path = '/api/5.4/index.html' - self.initial_paths = %w(/docs/5.4/installation /api/5.4/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.4/}, %r{\A/docs/5\.4/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.4/" - url - end + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '5.3' do self.release = '5.3.30' - self.root_path = '/api/5.3/index.html' - self.initial_paths = %w(/docs/5.3/installation /api/5.3/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.3/}, %r{\A/docs/5\.3/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.3/" - url - end + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '5.2' do self.release = '5.2.31' - self.root_path = '/api/5.2/index.html' - self.initial_paths = %w(/docs/5.2/installation /api/5.2/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.2/}, %r{\A/docs/5\.2/}] - - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.2/" - url - end + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '5.1' do self.release = '5.1.33' - self.root_path = '/api/5.1/index.html' - self.initial_paths = %w(/docs/5.1/installation /api/5.1/classes.html) - - options[:only_patterns] = [%r{\A/api/5\.1/}, %r{\A/docs/5\.1/}] + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] + end - options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/5.1/" - url - end + version '5.0' do + self.release = '5.0' + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] end version '4.2' do self.release = '4.2.11' - self.root_path = '/api/4.2/index.html' - self.initial_paths = %w(/docs/4.2/installation /api/4.2/classes.html) - - options[:only_patterns] = [%r{\A/api/4\.2/}, %r{\A/docs/4\.2/}] + self.base_url = "https://laravel.com/framework/docs/#{version}/installation" + self.base_urls = [ + "https://laravel.com/framework/docs/#{version}/", + ] options[:fix_urls] = ->(url) do - url.sub! %r{#{Regexp.escape(Laravel.base_url)}/docs\/(?!\d)}, "#{Laravel.base_url}/docs/4.2/" - url + url.sub( + %r{\Ahttps://laravel\.com/docs/4\.2/}, + 'https://laravel.com/framework/docs/4.2/' + ) end end