From 450adb5e722670503feeebac8432a611d5c46282 Mon Sep 17 00:00:00 2001 From: Phil Scherer Date: Wed, 2 Dec 2020 23:35:01 +0000 Subject: [PATCH 1/2] Add HAProxy documentation --- .../templates/pages/about_tmpl.coffee | 5 ++ assets/stylesheets/application.css.scss | 1 + assets/stylesheets/pages/_haproxy.scss | 28 ++++++++ lib/docs/filters/haproxy/clean_html.rb | 46 +++++++++++++ lib/docs/filters/haproxy/entries.rb | 49 ++++++++++++++ lib/docs/scrapers/haproxy.rb | 62 ++++++++++++++++++ public/icons/docs/haproxy/16.png | Bin 0 -> 24501 bytes public/icons/docs/haproxy/16@2x.png | Bin 0 -> 24066 bytes public/icons/docs/haproxy/SOURCE | 1 + 9 files changed, 192 insertions(+) create mode 100755 assets/stylesheets/pages/_haproxy.scss create mode 100755 lib/docs/filters/haproxy/clean_html.rb create mode 100755 lib/docs/filters/haproxy/entries.rb create mode 100644 lib/docs/scrapers/haproxy.rb create mode 100644 public/icons/docs/haproxy/16.png create mode 100644 public/icons/docs/haproxy/16@2x.png create mode 100644 public/icons/docs/haproxy/SOURCE diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index 913e00dd..0cebc816 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -351,6 +351,11 @@ credits = [ '2011-2017 Yehuda Katz', 'MIT', 'https://raw.githubusercontent.com/wycats/handlebars.js/master/LICENSE' + ], [ + 'HAProxy', + '2020 Willy Tarreau, HAProxy contributors', + 'GPLv2', + 'https://raw.githubusercontent.com/haproxy/haproxy/master/LICENSE' ], [ 'Haskell', 'The University of Glasgow', diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index 3f283cc0..175d96a6 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -62,6 +62,7 @@ 'pages/go', 'pages/graphite', 'pages/gnuplot', + 'pages/haproxy', 'pages/haskell', 'pages/jekyll', 'pages/jquery', diff --git a/assets/stylesheets/pages/_haproxy.scss b/assets/stylesheets/pages/_haproxy.scss new file mode 100755 index 00000000..24c49b47 --- /dev/null +++ b/assets/stylesheets/pages/_haproxy.scss @@ -0,0 +1,28 @@ +._haproxy { + padding-left: 1rem; + + h1, h2, h3 { margin-left: -1rem; } + h2 { @extend %block-heading; } + h3 { @extend %block-label; } + h4 { @extend %block-label; } + + ._mobile & { + padding-left: 0; + + h1, h2, h3 { margin-left: 0; } + } + + .pagination-centered { text-align: center; } + + .pull-right { float: right !important; } + + .keyword { @extend %block-label, %label-blue;} + + pre.text { + background: var(--contentBackground); + border-width: 0px; + } + + td.alert-success { background: var(--noteGreenBackground); } + td.alert-error { background: var(--noteRedBackground); } +} diff --git a/lib/docs/filters/haproxy/clean_html.rb b/lib/docs/filters/haproxy/clean_html.rb new file mode 100755 index 00000000..5df47477 --- /dev/null +++ b/lib/docs/filters/haproxy/clean_html.rb @@ -0,0 +1,46 @@ +module Docs + class Haproxy + class CleanHtmlFilter < Filter + def call + css('br', 'hr' '.text-right', '.dropdown-menu', 'table.summary').remove + css('.alert-success > img[src$="check.png"]').remove + css('.alert-error > img[src$="cross.png"]').remove + + at_css('.page-header').remove + + css('h1, h2, h3, h4').each do |node| + node.name = node.name.sub(/\d/) { |i| i.to_i + 1 } + node.remove_attribute('data-target') + end + + header = at_css('.text-center') + header.name = 'h1' + header.content = header.at_css('h3').content + + css('small > a').each do |node| + node.parent.content = node.content + end + + css('.page-header').each do |node| + node.replace node.children + end + + css('.keyword').each do |node| + node['id'] = node.at_css('.anchor')['name'] + end + + css('.dropdown').each do |node| + node.content = node.content + end + + css('table').each do |node| + node.keys.each do |attribute| + node.remove_attribute(attribute) + end + end + + doc + end + end + end +end diff --git a/lib/docs/filters/haproxy/entries.rb b/lib/docs/filters/haproxy/entries.rb new file mode 100755 index 00000000..167340fd --- /dev/null +++ b/lib/docs/filters/haproxy/entries.rb @@ -0,0 +1,49 @@ +module Docs + class Haproxy + class EntriesFilter < Docs::EntriesFilter + TYPE_BY_SLUG = { + 'intro' => 'Starter Guide', + 'configuration' => 'Configuration Manual', + 'management' => 'Management Guide', + } + + REPLACE_TYPE = { + 'Management: 2) Typed output format' => 'Statistics and monitoring' + } + + def get_name + 'HAProxy' + end + + def get_type + 'HAProxy' + end + + def additional_entries + entries = [] + + css('h2[id]', 'h3[id]').each do |node| + entries << [node.content.strip, node['id'], TYPE_BY_SLUG[slug]] + end + + type = 'x' + @doc.children.each do |node| + if node.name == 'h2' && node['id'] =~ /chapter/ + type = slug.titleize + ': ' + node.content.split('.').last.strip + elsif node.name == 'div' + node.css('.keyword').each do |n| + name = n.at_css('b').content + id = n.at_css('a.anchor')['name'] + entries << [name, URI.escape(id), REPLACE_TYPE[type] || type] + end + end + end + entries + end + + def include_default_entry? + false + end + end + end +end diff --git a/lib/docs/scrapers/haproxy.rb b/lib/docs/scrapers/haproxy.rb new file mode 100644 index 00000000..0a3aa752 --- /dev/null +++ b/lib/docs/scrapers/haproxy.rb @@ -0,0 +1,62 @@ +module Docs + class Haproxy < UrlScraper + self.type = 'haproxy' + self.root_path = 'intro.html' + self.initial_paths = %w(intro.html configuration.html management.html) + self.links = { + home: 'https://www.haproxy.org/', + code: 'https://github.com/haproxy/haproxy/' + } + + html_filters.push 'haproxy/clean_html', 'haproxy/entries' + + options[:container] = '#page-wrapper > .row > .col-lg-12' + + options[:follow_links] = false + + options[:attribution] = <<-HTML + © 2020 Willy Tarreau, HAProxy contributors
+ Licensed under the GNU General Public License version 2. + HTML + + version '2.3' do + self.release = '2.3.0' + self.base_url = "http://cbonte.github.io/haproxy-dconv/#{self.version}/" + end + + version '2.2' do + self.release = '2.2.5' + self.base_url = "http://cbonte.github.io/haproxy-dconv/#{self.version}/" + end + + version '2.1' do + self.release = '2.1.10' + self.base_url = "http://cbonte.github.io/haproxy-dconv/#{self.version}/" + end + + version '2.0' do + self.release = '2.0.19' + self.base_url = "http://cbonte.github.io/haproxy-dconv/#{self.version}/" + end + + version '1.9' do + self.release = '1.9.16' + self.base_url = "http://cbonte.github.io/haproxy-dconv/#{self.version}/" + end + + version '1.8' do + self.release = '1.8.27' + self.base_url = "http://cbonte.github.io/haproxy-dconv/#{self.version}/" + end + + version '1.7' do + self.release = '1.7.12' + self.base_url = "http://cbonte.github.io/haproxy-dconv/#{self.version}/" + end + + def get_latest_version(opts) + doc = fetch_doc('http://www.haproxy.org', opts) + doc.at_css('table[cols=6]').css('tr')[1].at_css('td').content + end + end +end diff --git a/public/icons/docs/haproxy/16.png b/public/icons/docs/haproxy/16.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3577c79b72a90c44712d2bfcfd946c99819ce4 GIT binary patch literal 24501 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 literal 0 HcmV?d00001 diff --git a/public/icons/docs/haproxy/SOURCE b/public/icons/docs/haproxy/SOURCE new file mode 100644 index 00000000..a5558641 --- /dev/null +++ b/public/icons/docs/haproxy/SOURCE @@ -0,0 +1 @@ +http://www.haproxy.org/img/HAProxyCommunityEdition_60px.png From a86391bf291f9c7716e88bd0553d1770d67d67af Mon Sep 17 00:00:00 2001 From: Phil Scherer Date: Fri, 4 Dec 2020 07:33:12 +0000 Subject: [PATCH 2/2] Fix small issues with HAProxy scraper --- lib/docs/filters/haproxy/clean_html.rb | 6 +++++- lib/docs/filters/haproxy/entries.rb | 2 +- lib/docs/scrapers/haproxy.rb | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/docs/filters/haproxy/clean_html.rb b/lib/docs/filters/haproxy/clean_html.rb index 5df47477..78f8e818 100755 --- a/lib/docs/filters/haproxy/clean_html.rb +++ b/lib/docs/filters/haproxy/clean_html.rb @@ -2,7 +2,7 @@ module Docs class Haproxy class CleanHtmlFilter < Filter def call - css('br', 'hr' '.text-right', '.dropdown-menu', 'table.summary').remove + css('br, hr, .text-right, .dropdown-menu, table.summary').remove css('.alert-success > img[src$="check.png"]').remove css('.alert-error > img[src$="cross.png"]').remove @@ -29,6 +29,10 @@ module Docs node['id'] = node.at_css('.anchor')['name'] end + css('.keyword > b').each do |node| + node.content = node.content + end + css('.dropdown').each do |node| node.content = node.content end diff --git a/lib/docs/filters/haproxy/entries.rb b/lib/docs/filters/haproxy/entries.rb index 167340fd..8a8d90ca 100755 --- a/lib/docs/filters/haproxy/entries.rb +++ b/lib/docs/filters/haproxy/entries.rb @@ -33,7 +33,7 @@ module Docs elsif node.name == 'div' node.css('.keyword').each do |n| name = n.at_css('b').content - id = n.at_css('a.anchor')['name'] + id = n['id'] entries << [name, URI.escape(id), REPLACE_TYPE[type] || type] end end diff --git a/lib/docs/scrapers/haproxy.rb b/lib/docs/scrapers/haproxy.rb index 0a3aa752..bc536d36 100644 --- a/lib/docs/scrapers/haproxy.rb +++ b/lib/docs/scrapers/haproxy.rb @@ -1,5 +1,6 @@ module Docs class Haproxy < UrlScraper + self.name = 'HAProxy' self.type = 'haproxy' self.root_path = 'intro.html' self.initial_paths = %w(intro.html configuration.html management.html)