diff --git a/lib/docs/filters/tailwindcss/clean_html.rb b/lib/docs/filters/tailwindcss/clean_html.rb index 9815cf090a..bdab80b912 100644 --- a/lib/docs/filters/tailwindcss/clean_html.rb +++ b/lib/docs/filters/tailwindcss/clean_html.rb @@ -2,26 +2,38 @@ module Docs class Tailwindcss class CleanHtmlFilter < Filter def call + # Move h1 out of wrapper. + css('h1').each do |node| + doc.prepend_child(node) + end + # Remove main page headers (top level sticky) - css('#__next > .sticky').remove + css('#__next > .sticky', 'div.fixed.inset-x-0.top-0').remove # And anything absolutely positioned (fancy floating navigation elements we don't care about) - css('#__next .absolute').remove + css('#__next .absolute', '.fixed').remove # Remove the left-navigation we scraped css('nav').remove css('svg').remove if root_page? - # Remove the duplicate category name at the top of the page - redundant - at_css('header#header > div:first-child > p:first-child').remove - # Remove the right navigation sidebar - at_css('header#header').parent.css('> div:has(h5:contains("On this page"))').remove + css('header#header', 'p[data-section]').each do |node| + node.parent.css('> div:has(h5:contains("On this page"))').remove # v3 + + node.parent.parent.css('div.max-xl\\:hidden').remove # v4 + end + + # Remove the duplicate category name at the top of the page - redundant + css( + 'header#header > div:first-child > p:first-child', # v3 + 'p[data-section]' # v4 + ).remove # Remove footer + prev/next navigation - at_css('footer').remove + css('footer', '.row-start-5').remove # Handle long lists of class reference that otherwise span several scrolled pages - if class_reference = at_css('#class-reference') + if class_reference = at_css('#class-reference', '#quick-reference') reference_container = class_reference.parent classes_container = reference_container.children.reject{ |child| child == class_reference }.first @@ -33,7 +45,7 @@ def call end # Remove border color preview column as it isn't displayed anyway - if result[:path] == "border-color" and class_reference = at_css('#class-reference') + if result[:path] == "border-color" and class_reference = at_css('#class-reference', '#quick-reference') class_reference.parent.css("thead th:nth-child(3)").remove class_reference.parent.css("tbody td:nth-child(3)").remove end @@ -59,29 +71,48 @@ def call end # Remove buttons to expand lists - those are already expanded and the button is useless - css('div > button:contains("Show all classes")').each do |node| + css( + 'div > button:contains("Show all classes")', + 'div > button:contains("Show more")' + ).each do |node| node.parent.remove end # Remove class examples - not part of devdocs styleguide? (similar to bootstrap) # Refer to https://github.com/freeCodeCamp/devdocs/pull/1534#pullrequestreview-649818936 - css('.not-prose').each do |node| - if node.parent.children.length == 1 - node.parent.remove - else - node.remove - end - end + css('.mt-4.-mb-3', 'figure', 'svg', '.flex.space-x-2').remove - # Properly format code examples + # Properly format code examples. css('pre > code:first-child').each do |node| - node.parent['data-language'] = node['class'][/language-(\w+)/, 1] if node['class'] and node['class'][/language-(\w+)/] - node.parent.content = node.parent.content + # v4 doesn't provide language context, so it must be inferred imperfectly. + node.parent['data-language'] = + if node.content.include?('function') + 'jsx' + elsif node.content.include?("") + 'html' + else + 'css' + end + + node.parent.content = + if version == '3' + node.parent.content + else + node.css('.line').map(&:content).join("\n") + end + end + + # Remove headers some code examples have. + css('.flex.text-slate-400.text-xs.leading-6', '.px-3.pt-0\\.5.pb-1\\.5').remove + + # Strip anchor from headers + css('h2', 'h3').each do |node| + node.content = node.inner_text end @doc.traverse { |node| cleanup_tailwind_classes(node) } - #remove weird