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