diff --git a/lib/docs/filters/godot/clean_html.rb b/lib/docs/filters/godot/clean_html.rb
index 9543f102..54ace4df 100644
--- a/lib/docs/filters/godot/clean_html.rb
+++ b/lib/docs/filters/godot/clean_html.rb
@@ -6,12 +6,13 @@ module Docs
at_css('h1').content = 'Godot Engine'
at_css('.admonition.note').remove
end
+ css('.admonition-grid').remove
- css('ul[id].simple li:first-child:last-child').each do |node|
+ css('p[id]').each do |node|
heading = Nokogiri::XML::Node.new 'h3', doc.document
- heading['id'] = node.parent['id']
+ heading['id'] = node['id']
heading.children = node.children
- node.parent.before(heading).remove
+ node.before(heading).remove
end
css('h3 strong').each do |node|
@@ -20,6 +21,22 @@ module Docs
css('a.reference').remove_attr('class')
+ # flatten gdscript+C# example blocks and add language name.
+ css('div[role="tabpanel"]').each do |node|
+ language_label = Nokogiri::XML::Node.new 'strong', doc.document
+ language_name = 'GDScript' if node.at_css('div.highlight-gdscript')
+ language_name = 'C#' if node.at_css('div.highlight-csharp')
+ language_label.content = language_name.to_s
+
+ node.before(language_label)
+ node.before(node.children).remove
+ end
+
+ css('div.sphinx-tabs [role="tablist"]').remove
+
+ # remove the remotely hosted "percent-translated" badge
+ css('a[href^="https://hosted.weblate"]').remove if root_page?
+
doc
end
end
diff --git a/lib/docs/filters/godot/clean_html_v2.rb b/lib/docs/filters/godot/clean_html_v2.rb
index 1379818a..9245b6cc 100644
--- a/lib/docs/filters/godot/clean_html_v2.rb
+++ b/lib/docs/filters/godot/clean_html_v2.rb
@@ -4,7 +4,7 @@ module Docs
def call
if root_page?
at_css('h1').content = 'Godot Engine'
- at_css('.admonition.tip').remove
+ at_css('.admonition.caution').remove
end
css('ul[id].simple li:first-child:last-child').each do |node|
diff --git a/lib/docs/filters/godot/clean_html_v3.rb b/lib/docs/filters/godot/clean_html_v3.rb
new file mode 100644
index 00000000..819066f7
--- /dev/null
+++ b/lib/docs/filters/godot/clean_html_v3.rb
@@ -0,0 +1,27 @@
+module Docs
+ class Godot
+ class CleanHtmlV3Filter < Filter
+ def call
+ if root_page?
+ at_css('h1').content = 'Godot Engine'
+ at_css('.admonition.caution').remove
+ end
+
+ css('ul[id].simple li:first-child:last-child').each do |node|
+ heading = Nokogiri::XML::Node.new 'h3', doc.document
+ heading['id'] = node.parent['id']
+ heading.children = node.children
+ node.parent.before(heading).remove
+ end
+
+ css('h3 strong').each do |node|
+ node.before(node.children).remove
+ end
+
+ css('a.reference').remove_attr('class')
+
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/godot/entries.rb b/lib/docs/filters/godot/entries.rb
index 202c46e5..9cda5afa 100644
--- a/lib/docs/filters/godot/entries.rb
+++ b/lib/docs/filters/godot/entries.rb
@@ -11,7 +11,7 @@ module Docs
if slug.start_with?('getting_started')
# Getting started sections are different even between different minor
# versions from v3 so we're programmatically generating them instead.
- "Getting started: " + slug.split('/')[1].tr_s('_', ' ').capitalize
+ 'Getting started: ' + slug.split('/')[1].tr_s('_', ' ').capitalize
else
name
end
@@ -20,9 +20,10 @@ module Docs
def additional_entries
return [] unless slug.start_with?('classes')
- css('.simple[id]').each_with_object [] do |node, entries|
+ css('p[id]').each_with_object [] do |node, entries|
name = node.at_css('strong').content
next if name == self.name
+
name.prepend "#{self.name}."
name << '()'
entries << [name, node['id']] unless entries.any? { |entry| entry[0] == name }
@@ -32,6 +33,7 @@ module Docs
def include_default_entry?
return false if subpath.start_with?('getting_started') && subpath.end_with?('index.html')
return false if subpath == 'classes/index.html'
+
true
end
end
diff --git a/lib/docs/filters/godot/entries_v3.rb b/lib/docs/filters/godot/entries_v3.rb
new file mode 100644
index 00000000..44d85146
--- /dev/null
+++ b/lib/docs/filters/godot/entries_v3.rb
@@ -0,0 +1,39 @@
+module Docs
+ class Godot
+ class EntriesV3Filter < Docs::EntriesFilter
+ def get_name
+ name = at_css('h1').content
+ name.remove! "\u{00B6}" # Remove the pilcrow
+ name
+ end
+
+ def get_type
+ if slug.start_with?('getting_started')
+ # Getting started sections are different even between different minor
+ # versions from v3 so we're programmatically generating them instead.
+ "Getting started: " + slug.split('/')[1].tr_s('_', ' ').capitalize
+ else
+ name
+ end
+ end
+
+ def additional_entries
+ return [] unless slug.start_with?('classes')
+
+ css('.simple[id]').each_with_object [] do |node, entries|
+ name = node.at_css('strong').content
+ next if name == self.name
+ name.prepend "#{self.name}."
+ name << '()'
+ entries << [name, node['id']] unless entries.any? { |entry| entry[0] == name }
+ end
+ end
+
+ def include_default_entry?
+ return false if subpath.start_with?('getting_started') && subpath.end_with?('index.html')
+ return false if subpath == 'classes/index.html'
+ true
+ end
+ end
+ end
+end
diff --git a/lib/docs/scrapers/godot.rb b/lib/docs/scrapers/godot.rb
index f3cfb08b..3c799547 100644
--- a/lib/docs/scrapers/godot.rb
+++ b/lib/docs/scrapers/godot.rb
@@ -5,59 +5,72 @@ module Docs
home: 'https://godotengine.org/',
code: 'https://github.com/godotengine/godot'
}
+ # godot docs since 3.5 don't link everything from the index.
+ self.initial_paths = %w[
+ getting_started/introduction/index.html
+ getting_started/step_by_step/index.html
+ classes/index.html
+ ]
- options[:container] = '.document .section'
-
+ options[:container] = '.document > [itemprop="articleBody"]'
options[:download_images] = false
- options[:only_patterns] = [/\Agetting_started\//, /\Aclasses\//]
+ options[:only_patterns] = [%r{\Agetting_started/}, %r{\Aclasses/}]
- options[:attribution] = ->(filter) do
- if filter.subpath.start_with?('classes')
- <<-HTML
- © 2014–2022 Juan Linietsky, Ariel Manzur, Godot Engine contributors
- Licensed under the MIT License.
- HTML
- else
- <<-HTML
- © 2014–2022 Juan Linietsky, Ariel Manzur and the Godot community
- Licensed under the Creative Commons Attribution Unported License v3.0.
- HTML
- end
+ options[:attribution] = <<-HTML
+ © 2014–present Juan Linietsky, Ariel Manzur and the Godot community
+ Licensed under the Creative Commons Attribution Unported License v3.0.
+ HTML
+
+ version '4.2' do
+ self.release = '4.2.2'
+ self.base_url = "https://docs.godotengine.org/en/#{self.version}/"
+ html_filters.push 'godot/entries', 'godot/clean_html', 'sphinx/clean_html'
end
version '3.5' do
- self.release = '3.5.1'
+ self.release = '3.5.3'
self.base_url = "https://docs.godotengine.org/en/#{self.version}/"
- options[:container] = '.document > [itemprop="articleBody"] > section[id]'
+
+ # godot 3.5 upstream docs are formatted like godot4
html_filters.push 'godot/entries', 'godot/clean_html', 'sphinx/clean_html'
end
version '3.4' do
self.release = '3.4.5'
self.base_url = "https://docs.godotengine.org/en/#{self.version}/"
+
options[:container] = '.document > [itemprop="articleBody"] > section[id]'
- html_filters.push 'godot/entries', 'godot/clean_html', 'sphinx/clean_html'
+ html_filters.push 'godot/entries_v3', 'godot/clean_html_v3', 'sphinx/clean_html'
end
version '3.3' do
self.release = '3.3.0'
self.base_url = "https://docs.godotengine.org/en/#{self.version}/"
- html_filters.push 'godot/entries', 'godot/clean_html', 'sphinx/clean_html'
+ self.initial_paths = %w[/index.html]
+
+ options[:only_patterns] = [%r{\Aclasses/}]
+ options[:container] = '.document .section'
+ html_filters.push 'godot/entries_v3', 'godot/clean_html_v3', 'sphinx/clean_html'
end
version '3.2' do
self.release = '3.2.3'
self.base_url = "https://docs.godotengine.org/en/#{self.version}/"
- html_filters.push 'godot/entries', 'godot/clean_html', 'sphinx/clean_html'
+ self.initial_paths = %w[/index.html]
+
+ options[:only_patterns] = [%r{\Aclasses/}]
+ options[:container] = '.document .section'
+ html_filters.push 'godot/entries_v3', 'godot/clean_html_v3', 'sphinx/clean_html'
end
version '2.1' do
self.release = '2.1.6'
self.base_url = "https://docs.godotengine.org/en/#{self.version}/"
+ self.initial_paths = %w[/index.html]
options[:skip] = %w(classes/class_@global\ scope.html)
- options[:only_patterns] = [/\Alearning\//, /\Aclasses\//]
-
+ options[:only_patterns] = [%r{\Alearning/}, %r{\Aclasses/}]
+ options[:container] = '.document .section'
html_filters.push 'godot/entries_v2', 'godot/clean_html_v2', 'sphinx/clean_html'
end