From 39aa5b1c90d50f64ad08cae0e851bceca9cd554a Mon Sep 17 00:00:00 2001 From: Damilola Olowookere Date: Fri, 26 Feb 2021 16:52:04 +0100 Subject: [PATCH] First initial release of TailwindCSS DevDoc --- .../templates/pages/about_tmpl.coffee | 5 ++ lib/docs/filters/tailwindcss/clean_html.rb | 77 ++++++++++++++++++ lib/docs/filters/tailwindcss/entries.rb | 51 ++++++++++++ lib/docs/scrapers/tailwindcss.rb | 31 +++++++ public/icons/docs/tailwindcss/16.png | Bin 0 -> 2230 bytes public/icons/docs/tailwindcss/16@2x.png | Bin 0 -> 3486 bytes 6 files changed, 164 insertions(+) create mode 100644 lib/docs/filters/tailwindcss/clean_html.rb create mode 100644 lib/docs/filters/tailwindcss/entries.rb create mode 100644 lib/docs/scrapers/tailwindcss.rb create mode 100644 public/icons/docs/tailwindcss/16.png create mode 100644 public/icons/docs/tailwindcss/16@2x.png diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index 79edd81b..0e348f9d 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -842,6 +842,11 @@ credits = [ '2004-2017 Fabien Potencier', 'MIT', 'https://symfony.com/doc/current/contributing/code/license.html' + ], [ + 'TailwindCSS', + 'Adam Wathan', + 'MIT', + 'https://raw.githubusercontent.com/tailwindlabs/tailwindcss/master/LICENSE' ], [ 'Tcl/Tk', 'The Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation, and other parties', diff --git a/lib/docs/filters/tailwindcss/clean_html.rb b/lib/docs/filters/tailwindcss/clean_html.rb new file mode 100644 index 00000000..fda174a2 --- /dev/null +++ b/lib/docs/filters/tailwindcss/clean_html.rb @@ -0,0 +1,77 @@ +module Docs + class Tailwindcss + class CleanHtmlFilter < Filter + def call + clean_up + + # Remove code highlighting + css('pre').each do |node| + node.content = node.content + node['data-language'] = 'php' + end + + doc + end + + def clean_up + @doc = doc.at_css('#content-wrapper') + + css('.location').remove + + # Replace .header with

+ css('.page-header > h1').each do |node| + node.content = 'Tailwind' if root_page? + node.parent.before(node).remove + end + + css('.container-fluid').each do |node| + node.name = 'table' + node.css('.row').each { |n| n.name = 'tr' } + node.css('div[class^="col"]').each { |n| n.name = 'td' } + end + + css('> div').each do |node| + node.before(node.children).remove + end + + # Remove + css('a > abbr').each do |node| + node.parent['title'] = node['title'] + node.before(node.children).remove + end + + # Clean up headings + css('h1 > a', '.content', 'h3 > code', 'h3 strong', 'abbr').each do |node| + node.before(node.children).remove + end + + # Remove empty + css('td').each do |node| + node.remove if node.content =~ /\A\s+\z/ + end + + # @doc = at_css('.docs_body') + + # Clean up headings + css('h2 > a').each do |node| + node.before(node.children).remove + end + + css('p > a[name]').each do |node| + node.parent.next_element['id'] = node['name'] + end + + css('blockquote').each do |node| + node['class'] = 'tip' if node.inner_html.include?('{tip}') + node.inner_html = node.inner_html.remove(/\{(tip|note)\}\s?/) + end + + css('blockquote').each do |node| + if node.inner_html.include?('You\'re browsing the documentation for an old version of Laravel.') + node.remove + end + end + end + end + end +end diff --git a/lib/docs/filters/tailwindcss/entries.rb b/lib/docs/filters/tailwindcss/entries.rb new file mode 100644 index 00000000..2fc2af2b --- /dev/null +++ b/lib/docs/filters/tailwindcss/entries.rb @@ -0,0 +1,51 @@ +module Docs + class Tailwindcss + class EntriesFilter < Docs::EntriesFilter + # def get_name + # if api_page? + # name = at_css('h1').content.strip.remove('Illuminate\\') + # name << " (#{type})" unless name.start_with?(self.type) + # name + # else + # at_css('h1').content + # end + # end + + def get_type + # /customizing-colors rediects to /colors, hence making css + # selector below not to match the href + if result[:path] == 'customizing-colors' + selector = "#sidebar a[href='#{result[:path]}']" + else + selector = "#sidebar a[href='#{result[:path]}']" + end + + check = at_css(selector).parent.parent.parent.css('h5').inner_text + check + end + + # def additional_entries + # return [] if root_page? || !api_page? + # base_name = self.name.remove(/\(.+\)/).strip + + # css('h3[id^="method_"]').each_with_object [] do |node, entries| + # next if node.at_css('.location').content.start_with?('in') + + # name = node['id'].remove('method_') + # name.prepend "#{base_name}::" + # name << '()' + + # entries << [name, node['id']] + # end + # end + + # def api_page? + # subpath.start_with?('/api') + # end + + # def include_default_entry? + # true + # end + end + end +end diff --git a/lib/docs/scrapers/tailwindcss.rb b/lib/docs/scrapers/tailwindcss.rb new file mode 100644 index 00000000..d13dfe24 --- /dev/null +++ b/lib/docs/scrapers/tailwindcss.rb @@ -0,0 +1,31 @@ +module Docs + class Tailwindcss < UrlScraper + self.name = 'Tailwind CSS' + self.type = 'tailwindcss' + self.slug = 'tailwindcss' + self.base_url = 'https://tailwindcss.com/docs' + self.root_path = '/installation' + self.release = '8.5' + + html_filters.push 'tailwindcss/entries', 'tailwindcss/clean_html' + + # options[:container] = 'body'; + + options[:skip_patterns] = [ + %r{\/guides\/.*}, + %r{\/colors\z} + ] + + #Obtainable from https://github.com/tailwindlabs/tailwindcss/blob/master/LICENSE + options[:attribution] = <<-HTML + MIT License
+ Copyright (c) Adam Wathan
+ Copyright (c) Jonathan Reinink
+ HTML + + def get_latest_version(opts) + doc = fetch_doc('https://tailwindcss.com/docs/installation', opts) + doc.at_css('select option[value=v2]').inner_text + end + end +end diff --git a/public/icons/docs/tailwindcss/16.png b/public/icons/docs/tailwindcss/16.png new file mode 100644 index 0000000000000000000000000000000000000000..697450ec825e21a2098cdd5dabe4a2a7611b476e GIT binary patch literal 2230 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