diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index cc8675d3..4a8f307f 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -37,6 +37,7 @@ 'pages/clojure', 'pages/coffeescript', 'pages/d3', + 'pages/drupal', 'pages/ember', 'pages/express', 'pages/git', diff --git a/assets/stylesheets/pages/_drupal.scss b/assets/stylesheets/pages/_drupal.scss new file mode 100644 index 00000000..d1aa236e --- /dev/null +++ b/assets/stylesheets/pages/_drupal.scss @@ -0,0 +1,10 @@ +._drupal { + h1#page-subtitle { + margin-top: 0; + @extend %lined-heading; + } + + h3 { @extend %block-heading; } + + .signature { @extend %note, %note-blue; } +} \ No newline at end of file diff --git a/lib/docs/filters/drupal/clean_html.rb b/lib/docs/filters/drupal/clean_html.rb new file mode 100644 index 00000000..f44214db --- /dev/null +++ b/lib/docs/filters/drupal/clean_html.rb @@ -0,0 +1,24 @@ +module Docs + class Drupal + class CleanHtmlFilter < Filter + def call + root_page? ? root : other + doc + end + + def root + doc.inner_html = ' ' + end + + def other + css('#page-title-tools', '.element-invisible', '.breadcrumb', '#sidebar-first', '#api-alternatives').remove + css('#aside', '#api-function-signature tr:not(.active)', '.comments').remove + # Replaces the signature table from api.drupal.org with a simple pre tag + css('#api-function-signature').each do |table| + signature = table.css('.signature').first.inner_html + table.replace '
' + signature + '
' + end + end + end + end +end diff --git a/lib/docs/filters/drupal/entries.rb b/lib/docs/filters/drupal/entries.rb new file mode 100644 index 00000000..95fa5748 --- /dev/null +++ b/lib/docs/filters/drupal/entries.rb @@ -0,0 +1,25 @@ +module Docs + class Drupal + class EntriesFilter < Docs::EntriesFilter + + def get_name + name = css('#page-subtitle').first.content + name.remove! 'function ' + name + end + + def path + Drupal::fixUri(result[:path]) + end + + def get_type + type = css('dl[api-related-topics] dt') + type.first ? type.first.content : nil + end + + def include_default_entry? + !initial_page? + end + end + end +end diff --git a/lib/docs/filters/drupal/internal_urls.rb b/lib/docs/filters/drupal/internal_urls.rb new file mode 100644 index 00000000..bc3e7bb9 --- /dev/null +++ b/lib/docs/filters/drupal/internal_urls.rb @@ -0,0 +1,12 @@ +module Docs + class Drupal + class InternalUrlsFilter < Docs::InternalUrlsFilter + def internal_path_to(url) + url = index_url if url == root_url + path = effective_url.relative_path_to(url) + URL.new(path: Drupal::fixUri(path), query: url.query, fragment: url.fragment).to_s + end + end + end +end + diff --git a/lib/docs/filters/drupal/normalize_paths.rb b/lib/docs/filters/drupal/normalize_paths.rb new file mode 100644 index 00000000..61ad5608 --- /dev/null +++ b/lib/docs/filters/drupal/normalize_paths.rb @@ -0,0 +1,11 @@ +module Docs + class Drupal + class NormalizePathsFilter < Docs::NormalizePathsFilter + + def store_path + p = Drupal::fixUri(@path) + File.extname(p) != '.html' ? "#{p}.html" : p + end + end + end +end \ No newline at end of file diff --git a/lib/docs/scrapers/drupal.rb b/lib/docs/scrapers/drupal.rb new file mode 100644 index 00000000..054b44cd --- /dev/null +++ b/lib/docs/scrapers/drupal.rb @@ -0,0 +1,65 @@ +module Docs + class Drupal < UrlScraper + self.name = 'Drupal' + self.type = 'drupal' + self.version = '7.37' + self.base_url = 'https://api.drupal.org/api/drupal/' + self.initial_paths = %w( + groups + groups?page=1) + + html_filters.replace 'normalize_paths', 'drupal/normalize_paths' + html_filters.replace 'internal_urls', 'drupal/internal_urls' + + html_filters.push 'drupal/entries', 'drupal/clean_html', 'title' + + options[:container] = '#page' + options[:title] = false + options[:root_title] = 'Drupal - Open Source CMS | Drupal.org' + + options[:only_patterns] = [ + /\/group\/[^\/]+/, + /\/function\/[^\/]+/] + + options[:skip_link] = ->(link) { + begin + return unless q = URL.parse(link['href']).query + Hash[URI.decode_www_form(q)].has_key? "order" + rescue URI::InvalidURIError + false + end + } + + options[:skip] = %w( + 'modules-system-system.install/group/updates-7.x-extra/7', + 'modules-system-system.install/group/updates-6.x-to-7.x/7') + + options[:skip_patterns] = [ + /\/group\/updates\-7/, + /\/group\/updates\-6/, + /_update_[0-9]{4}/, # Skip update functions + /\/[4-6](\.[0-9])*$/, # Skip previous versions + /\/[8-9](\.[0-9])*$/, # Skip future versions + /\/function\/calls\//, # Skip function calls listings + /\/function\/implementations\//, # Skip hook implementation listings + /\.test\/function\// # Skip test files + ] + + options[:fix_urls] = ->(url) do + url.sub! /\/7$/, '' # Remove the version indicator from the current version + url + end + + options[:attribution] = <<-HTML + © 2000–2015 by the individual contributors.
+ Licensed under the Creative Commons License, Attribution-ShareAlike2.0.
+ Drupal is a registered trademark of Dries Buytaert. + HTML + + # Method used at several places to fix special characters at urls from api.drupal.org + def self.fixUri(path) + p = path.gsub /%21|!|%2b|%3b|%3a/i, '-' # !+;: + end + + end +end diff --git a/public/icons/docs/drupal/16.png b/public/icons/docs/drupal/16.png new file mode 100644 index 00000000..f731b7d3 Binary files /dev/null and b/public/icons/docs/drupal/16.png differ diff --git a/public/icons/docs/drupal/16@2x.png b/public/icons/docs/drupal/16@2x.png new file mode 100644 index 00000000..bea552a8 Binary files /dev/null and b/public/icons/docs/drupal/16@2x.png differ diff --git a/public/icons/docs/drupal/SOURCE b/public/icons/docs/drupal/SOURCE new file mode 100644 index 00000000..fb550148 --- /dev/null +++ b/public/icons/docs/drupal/SOURCE @@ -0,0 +1 @@ +https://www.drupal.org/node/9068