require 'pry'
require 'nokogiri'

# This class goes through the generated default LaTeX HTML and performs
# several optimisations on the HTML. Nokogiri is used to facilitate the
# modifications.

class InvalidWebsiteFormat < StandardError; end

class ModifyBuild
  HOST = "https://www.the-sourdough-framework.com".freeze

  def self.build
    new.build
  end

  def build
    build_latex_html
    create_sitemap
  rescue InvalidWebsiteFormat => e
    raise e
  end

  private

  def create_sitemap
    content = ""
    list_of_files_to_modify.sort.each do |fn|
      # "static_website_html/Acknowledgements.html"
      # Only take the html part
      html_file_name = fn.split("/")[-1]
      content += "#{HOST}/#{html_file_name}\n"
    end
    File.open("#{build_dir}/sitemap.txt", 'w:UTF-8') { |file| file.write(content) }
  end

  def build_latex_html
    system("rm -rf #{build_dir}/")
    system("mkdir #{build_dir}/")
    copy_source_to_local_dir_for_modification
    copy_assets_into_folder
    list_of_files_to_modify.each do |filename|
      modify_file(filename)
    end
  end

  def modify_file(filename)
    orig_text = File.read(filename, encoding: "UTF-8")
    validate_file(orig_text)
    text = fix_double_slashes(orig_text)
    text = fix_navigation_bar(text)
    text = fix_titles(text)
    text = fix_menu(text)
    text = fix_cover_page(text) if is_cover_page?(filename)
    text = add_header_banner(text)
    text = add_home_link_to_menu(text)
    text = fix_anchor_hyperlinks_menu(text)
    text = add_favicon(text)
    text = add_meta_tags(text, filename)
    text = remove_section_table_of_contents(text)
    text = add_canonical_for_duplicates(text, extract_file_from_path(filename))
    text = include_javascript(text)
    text = add_text_to_coverpage(text, extract_file_from_path(filename))
    text = fix_js_dependency_link(text)
    text = fix_list_of_tables_figures_duplicates(text)
    text = add_anchors_to_headers(text)
    text = create_menu_groups(text)
    text = fix_top_links(text)
    text = fix_flowchart_background(text)
    text = remove_empty_menu_links(text)
    text = fix_bottom_cross_links(text)
    text = insert_mobile_header_graphic(text)
    text = fix_https_links(text)
    text = add_anchors_to_glossary_items(text) if is_glossary_page?(filename)
    text = mark_menu_as_selected_if_on_page(text, extract_file_from_path(filename))
    text = fix_menus_list_figures_tables(text) if is_list_figures_tables?(filename)
    text = fix_list_of_figures_tables_display(text) if is_list_figures_tables?(filename)
    File.open(filename, "w:UTF-8") {|file| file.puts text }
  end

  def is_cover_page?(filename)
    ["book.html", "index.html"].any? do |name|
      filename.include?(name)
    end
  end

  def is_glossary_page?(filename)
    filename.include?("Glossary.html")
  end

  def is_list_figures_tables?(filename)
    ["listfigurename.html", "listtablename.html", "listoflocname.html", "bibname.html"].any? do |name|
      filename.include?(name)
    end
  end

  def list_of_files_to_modify
    Dir.glob("#{build_dir}/*.html")
  end

  def copy_source_to_local_dir_for_modification
    system("cd ../book/ && make website") unless source_website_output_exists?
    system("cp -R ../book/#{build_dir}/* #{build_dir}")
  end

  def copy_assets_into_folder
    system("cp -R ./assets/* #{build_dir}")
  end

  def source_website_output_exists?
    File.directory?("../book/#{build_dir}/")
  end

  def build_dir
    'static_website_html'
  end

  def fix_double_slashes(text)
    text.gsub(/\/\//, "/")
  end

  # Sometimes for whatever reason the make4ht input produces files that are
  # improperly formatted. This validator will go through the files and do a
  # couple of basic checks to see if the files are in the format we expect. If
  # not an exception is caused.
  def validate_file(text)
    doc = build_doc(text)
    stylesheets = doc.css("link[rel='stylesheet']").map{|attr| attr["href"] }
    has_all_styles = %w(book.css style.css).all? { |required_stylesheet| stylesheets.include?(required_stylesheet) }
    raise InvalidWebsiteFormat.new("No style tag style.css found in the website") unless has_all_styles
    true
  end

  def fix_navigation_bar(text)
    doc = build_doc(text)
    elements = [doc.search('.chapterToc'), doc.search('.sectionToc'), doc.search('.subsectionToc')].flatten
    elements.each do |n|
      chapter_number_or_nothing = n.children[0].text.strip.gsub(/[[:space:]]/, '')
      hyperlink_node = n.children[1]
      next if hyperlink_node.nil?

      # remove unneeded text and merge into single a tag
      n.children[0].remove
      link_text = hyperlink_node.content
      # no chapter number
      if chapter_number_or_nothing == ""
        content = hyperlink_node.to_s
      else
        #binding.pry if link_text == "The process"
        link_node_content = %Q{
        <span class="chapter_number">#{chapter_number_or_nothing}</span>
        <span class="link_text">#{link_text}</span>
        }
        hyperlink_node.inner_html = link_node_content
        content = hyperlink_node.to_s
      end
      n.inner_html = content
    end
    doc.to_html
  end

  def create_menu_groups(text)
    doc = build_doc(text)
    groups = build_groups(doc.css(".menu-items > span"))
    menu_el = doc.css(".menu-items")[0]
    html = ""
    groups.each do |group|
      out = ""
      group.each do |g|
        if g.to_html.length > 0
          out += %Q{<div class="menu-entry">#{g.to_html}</div>}
        end
      end
      html += %Q{<div class="menu-group">
        <div class="menu-inner">
          #{out}
        </div>
        <img class="menu-arrow" src="arrow.png" />
      </div>}
    end
    menu_el.inner_html = html
    doc.to_html
  end

  def build_groups(menu_items)
    final_groups = []
    tmp_groups = []
    menu_items.each_with_index do |el, index|
      # Get next item and check if it is a lower entry level in the menu.
      next_item = menu_items[index + 1]
      if next_item && next_item["class"].include?("chapterToc") || next_item.nil?
        final_groups.push(tmp_groups.push(el))
        tmp_groups = []
      else
        tmp_groups.push(el)
      end
    end
    final_groups
  end

  # By default the titles look boring. This changes the titles of all the
  # pages and adds the book name as appendix
  def fix_titles(text)
    doc = build_doc(text)
    title_node = doc.css("title")[0]
    raise ArgumentError.new("No title found in HTML document") if title_node.nil?

    title_node.content = build_title(title_node.content)
    doc.to_html
  end

  # "3 Making a sourdough starter"
  # Should return Making a sourdough starter - The Sourdough Framework"
  def build_title(title)
    # No title, happens on index page in LaTeX build
    return title_appendix if title.length == 0

    # Starts with number
    if title[0].to_i > 0
      use_title = title.split(" ").drop(1).join(" ")
    else
      use_title = title
    end
    "#{use_title} - #{title_appendix}"
  end

  def title_appendix
    "The Sourdough Framework"
  end

  # By default the menu is not made for mobile devices. This adds mobile
  # capabilities to the menu
  def fix_menu(text)
    doc = build_doc(text)
    nav = doc.css("nav.TOC")[0]
    # page has no nav
    return text unless nav

    menu_items_html = doc.css("nav.TOC > *").to_html
    nav.add_class("menu")
    nav_content = %Q{
      #{menu_mobile_nav}
      <div class="menu-items">#{menu_items_html}</div>
    }
    nav.inner_html = nav_content
    doc.to_html
  end

  # By default the menu is not made for mobile devices. This adds mobile
  # capabilities to the menu
  def fix_menu(text)
    doc = build_doc(text)
    nav = doc.css("nav.TOC")[0]
    # page has no nav
    return text unless nav

    menu_items_html = doc.css("nav.TOC > *").to_html
    nav.add_class("menu")
    nav_content = %Q{
      #{menu_mobile_nav}
      <div class="menu-items">#{menu_items_html}</div>
    }
    nav.inner_html = nav_content
    doc.to_html
  end

  def menu_mobile_nav
  %Q{
    <a href="/" class="logo">
      🍞 The Sourdough Framework
    </a>
    <input type="checkbox" id="toggle-menu">
    <label class="hamb toggle-menu-label" for="toggle-menu"><span class="hamb-line"></span></label>
  }
  end

  # The cover page should have some additional content and allow the user to
  # click the book cover in order to start reading.
  def fix_cover_page(text)
    doc = build_doc(text)
    body = doc.css("body")[0]
    version = doc.css("body i")[0].text
    content = doc.css("body > .main-content")[0]
    menu = doc.css("body > nav")[0]
    content = %Q{
      <main class="titlepage main-content">
        <a href="Thehistoryofsourdough.html">
          <img src="cover-page.jpg" />
          <div class="version"><p>#{version}</p></div>
        </a>
      </main>
    }
    body.inner_html = "#{menu} #{content}"
    doc.to_html
  end

  # Users are lost and can't easily access the root page of the book. This
  # adds a home menu item.
  def add_home_link_to_menu(text)
    # Remove duplicate menu entries first before building clean menu
    doc = build_doc(remove_duplicate_entries_menu(text))

    menu = doc.css(".menu-items")[0]
    return text if menu.nil?

    home_html = %Q{<span class="chapterToc home-link"><a href="/">🍞 The Sourdough Framework</a></span>}
    # Normally the flowcharts link should be automatically added, but there
    # seems to be a problem in the generation. See:
    # https://github.com/hendricius/the-sourdough-framework/pull/188 for more
    # details
    appendix_html = %Q{
      <span class="chapterToc flowcharts-menu">
        <a href="listoflocname.html">
          <span class="link_text">List of Flowcharts</span>
        </a>
      </span>
      <span class="chapterToc listtables-menu">
        <a href="listtablename.html">
          <span class="link_text">List of Tables</span>
        </a>
      </span>
      <span class="chapterToc listfigures-menu">
        <a href="listfigurename.html">
          <span class="link_text">List of Figures</span>
        </a>
      </span>
      <span class="chapterToc">
        <a href="bibname.html">
          <span class="link_text">Bibliography</span>
        </a>
      </span>
      <span class="chapterToc">
        <a href="https://www.the-bread-code.io/book.pdf">
          <span class="chapter_number">⬇️</span>
          <span class="link_text">Book .PDF</span>
        </a>
      </span>
      <span class="chapterToc">
        <a href="https://www.the-bread-code.io/book.epub">
          <span class="chapter_number">⬇️</span>
          <span class="link_text">Book .EPUB</span>
        </a>
      </span>
      <span class="chapterToc">
        <a href="https://the-bread-code.io/book-tldr-digital.pdf">
          <span class="chapter_number">⬇️</span>
          <span class="link_text">Short TL;DR .PDF</span>
        </a>
      </span>
      <span class="chapterToc">
        <a href="https://breadco.de/hardcover-book">
          <span class="chapter_number">📚</span>
          <span class="link_text">Hardcover Book</span>
        </a>
      </span>
      <span class="chapterToc">
        <a href="https://www.github.com/hendricius/the-sourdough-framework">
          <span class="chapter_number">⚙️</span>
          <span class="link_text">Source code</span>
        </a>
      </span>
      <span class="chapterToc">
        <a href="https://breadco.de/kofi">
          <span class="chapter_number">⭐️</span>
          <span class="link_text">Support me</span>
        </a>
      </span>
    }
    menu.inner_html = "#{home_html} #{menu.inner_html} #{appendix_html}"
    doc.to_html
  end

  # Adds a header banner to each page
  def add_header_banner(text)
    doc = build_doc(text)
    body = doc.css("body")[0]
    footnotes = doc.css(".footnotes")[0]
    main = doc.css(".main-content")[0]
    menu = doc.css(".menu")[0]
    if main.nil? || menu.nil?
      #raise ArgumentError.new("Don't know how to handle")
      return doc.to_html
    end
    body.inner_html = %Q{
      <div class='wrapper'>
        #{build_header_html}
        <div class='book-content'>
          #{menu.to_html}
          <main class='main-content'>
            #{main.inner_html}
            #{footnotes ? footnotes.to_html : ''}
          </main>
        </div>
      </div>
    }
    return doc.to_html
  end

  def build_header_html
    %Q{
      <div class="header"><a href="/"><img src="banner.png"></a></div>
    }
  end

  # Some of the menu links are added in the wrong order. Remove them since we
  # later on add them in the structure that we want.
  def remove_duplicate_entries_menu(text)
    doc = build_doc(text)
    remove = ["List of Tables", "List of Figures"]
    selected_elements = doc.css(".menu-items .chapterToc > a").select do |el|
      remove.include?(el.text)
    end
    selected_elements.each(&:remove)
    doc.to_html
  end

  # Some of the links in the menu have an anchor. This makes clicking through
  # the menu frustrating as the browser jumps a lot on each request. Only do
  # this for the top level menu entries though.
  def fix_anchor_hyperlinks_menu(text)
    doc = build_doc(text)
    top_level_menus = doc.css(".menu-items > span.chapterToc > a")
    top_level_menus.each do |el|
      link = el.attribute("href").value
      splitted = link.split("#")
      next if splitted.length == 1

      el["href"] = splitted[0]
    end

    doc.to_html
  end

  def add_favicon(text)
    doc = build_doc(text)
    head = doc.css("head")[0]
    fav_html = %Q{<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />}
    head.inner_html = "#{head.inner_html} #{fav_html}"
    doc.to_html
  end

  def add_meta_tags(text, filename)
    doc = build_doc(text)
    head = doc.css("head")[0]
    title = head.css("title")[0].text
    cleaned_filename = extract_file_from_path(filename)
    # Exception for index.html when we are on the root page
    use_filename = ["index.html"].include?(cleaned_filename) ? "" : cleaned_filename
    description = extract_description(text, filename)
    og_image = og_image_for_chapter(cleaned_filename)
    meta_html = %Q{
      <meta property="og:locale" content="en_US">
      <meta property="og:site_name" content="The Sourdough Framework">
      <meta property="og:title" content="#{title}">
      <meta property="og:type" content="article">
      <meta property="og:url" content="#{HOST}/#{cleaned_filename}">
      <meta property="og:description" content="#{description}">
      <meta property="description" content="#{description}">
      <meta property="og:image" content="#{HOST}/#{og_image}" />
    }
    head.inner_html = "#{head.inner_html} #{meta_html}"
    doc.to_html
  end

  # Takes a name like "static_website_html/book.html" and returns "book.html"
  def extract_file_from_path(filename)
    result = filename.split("/")
    return filename if result.length == 1
    raise ArgumentError.new("The filename #{filename} is odd. Don't know how to handle it") if result.length > 2

    result[1]
  end

  def extract_description(text, filename)
    doc = build_doc(text)
    el = doc.css(".main-content p:first-of-type")[0]
    custom = custom_titles_per_filename(clean_filename(filename))
    return custom.strip if custom
    return "" if el.nil?
    el.text.strip
  end

  # static_website_html/Acknowledgements.html => "Acknowledgements.html"
  def clean_filename(filename)
    filename.split("/")[1]
  end

  def custom_titles_per_filename(filename)
    index_text = "The Sourdough Framework goes beyond just recipes and provides a solid knowledge foundation, covering the science of sourdough, the basics of bread making, and advanced techniques for achieving the perfect sourdough bread at home."
    data = {
      "book.html" => index_text,
      "index.html" => index_text
    }
    data[filename]
  end

  def remove_section_table_of_contents(text)
    doc = build_doc(text)
    el = doc.css(".sectionTOCS")[0]
    return text unless el

    el.remove
    doc.to_html
  end

  def og_image_for_chapter(chapter_name)
    open_graph_images_map[chapter_name] || open_graph_images_map["index.html"]
  end

  def open_graph_images_map
    {
      "Baking.html" => "og_image_baking.png",
      "Breadtypes.html" => "og_image_bread_types.png",
      "Flourtypes.html" => "og_image_flour_types.png",
      "index.html" => "og_image_general.png",
      "Howsourdoughworks.html" => "og_image_how_sourdough_works.png",
      "Makingasourdoughstarter.html" => "og_image_making_a_sourdough_starter.png",
      "Nonwheatsourdough.html" => "og_image_non_wheat_sourdough.png",
      "Sourdoughstartertypes.html" => "og_image_sourdough_starter_types.png",
      "Storingbread.html" => "og_image_storing_bread.png",
      "Thehistoryofsourdough.html" => "og_image_the_history_of_sourdough.png",
      "Wheatsourdough.html" => "og_image_wheat_sourdough.png",
      "Troubleshooting.html" => "og_image_troubleshooting.png",
      "Mixins.html" => "og_image_mixins.png",
    }
  end

  def mark_menu_as_selected_if_on_page(text, filename)
    doc = build_doc(text)

    selected = doc.css(".menu-items .chapterToc > a").find do |el|
      el["href"] == ""
    end

    # Special case for index page
    #if ["index.html", "book.html"].include?(filename)
    #  doc.css(".menu-items .chapterToc.home-link")[0].add_class("selected")
    #  return doc.to_html
    #end

    # Special case for the flowcharts page which is added by us to the menu.
    # This needs to be done for future manually added pages too
    if "listoflocname.html" == filename
      doc.css(".menu-items .chapterToc.flowcharts-menu")[0].ancestors(".menu-group")[0].add_class("selected")
      return doc.to_html
    end

    if "listtablename.html" == filename
      doc.css(".menu-items .chapterToc.listtables-menu")[0].ancestors(".menu-group")[0].add_class("selected")
      return doc.to_html
    end

    if "listfigurename.html" == filename
      doc.css(".menu-items .chapterToc.listfigures-menu")[0].ancestors(".menu-group")[0].add_class("selected")
      return doc.to_html
    end

    return doc.to_html unless selected

    # Fix that when the menu is selected the href is empty. This way users can
    # click the menu and the page will reload.
    selected["href"] = filename
    selected.ancestors(".menu-group")[0].add_class("selected")
    doc.to_html
  end

  def add_canonical_for_duplicates(text, filename)
    # Only applies to book.html which is a duplicate for index.html. The file
    # is still needed though for proper display.
    canonical_pages = ["book.html", "index.html"]
    return text unless canonical_pages.include?(filename)
    doc = build_doc(text)
    head = doc.css("head")[0]
    canonical_html = %Q{
      <link rel="canonical" href="https://www.the-sourdough-framework.com" />
    }
    head.inner_html = "#{head.inner_html} #{canonical_html}"
    doc.to_html
  end

  def include_javascript(text)
    doc = build_doc(text)
    head = doc.css("head")[0]
    js_tag_html = %Q{
      <script type="text/javascript" src="script.js"></script>
    }
    head.inner_html = "#{head.inner_html} #{js_tag_html}"
    doc.to_html
  end

  def add_text_to_coverpage(text, filename)
    return text unless is_cover_page?(filename)
    doc = build_doc(text)
    content = doc.css(".main-content")[0]
    content.inner_html = "#{build_cover_page_content} #{content.inner_html}"
    doc.to_html
  end

  def add_anchors_to_glossary_items(text)
    doc = build_doc(text)
    content = doc.css("dt.description")
    content.each do |el|
      term = el.css("span")[0]
      item_name = term&.text
      # No anchor for whatever reason
      next unless item_name

      anchor = item_name.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
      copy_link = %Q{<a href="#term-#{anchor}" class="permalink">🔗</a>}
      el.set_attribute("id", "term-#{anchor}")
      term.inner_html = "#{term.inner_html}#{copy_link}"
    end
    doc.to_html
  end

  def build_cover_page_content
    %Q{
    <h2 class="chapterHead home-title">
      🍞 The Sourdough Framework
    </h2>
    <p class="noindent">
       The Sourdough Framework goes beyond just recipes and provides you a solid
       knowledge foundation, covering the science of sourdough, the basics of
       bread making, and advanced techniques for achieving the perfect sourdough bread at home.
    </p>

    <div class="videoWrapper">
      <iframe width="560" height="349" src="https://www.youtube-nocookie.com/embed/l0GwG74otX4?controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
    </div>

    <p class="noindent">
       Creating this book has been a labor of love. My
       main goal has always been to spread the joy of baking and empower bread
       enthusiasts like yourself. To ensure that the book remains accessible
       to everyone, I have decided to make it available free of charge.
    </p>

    <a href="bread.jpg">
      <img alt="One of my best Sourdough Breads" class="home-bread" src="bread.jpg" />
    </a>

    <h2 class="chapterHead home-content-title">⭐ Support this project</h2>
    <p class="noindent">
      Producing and maintaining resources like this requires
      considerable time, effort, and financial investment. If you find value
      in "The Sourdough Framework" and appreciate the effort that went into
      creating it, I kindly request your support <a href="https://breadco.de/book">
      through a donation</a> or by
      <a href="https://www.breadco.de/hardcover-book">considering the purchase of
      the hardcover version of this book.</a>
    </p>

    <p class="noindent">
      Your generous contribution will not only help me cover the costs associated
      with this project but will also enable me to continue creating more valuable
      content in the future. Your donation is entirely voluntary and any amount you
      contribute is deeply appreciated. If you are unable to make a donation at
      this time, please know that your readership and support in spreading the
      word about "The Sourdough Framework" are invaluable contributions as well.
    </p>

    <p class="noindent">
      Thank you for being a part of this journey, and I hope that
      "The Sourdough Framework" enriches your bread-making adventures.
      Together, we can continue to share the love of baking and cultivate a
      community passionate about the art of sourdough.
    </p>

    <h2 class="chapterHead home-content-title">⬇️ Versions</h2>
    <p class="noindent">
      You can either browse through this website or download the full book to read it on your preferred device:
    </p>

    <div class="download-links">
      <p class="noindent">
        <span class="download-description">PDF:</span> <a href="https://www.the-bread-code.io/book.pdf">https://www.the-bread-code.io/book.pdf</a><br>
        <span class="download-description">PDF (no serif):</span> <a href="https://www.the-bread-code.io/book-sans-serif.pdf">https://www.the-bread-code.io/book-sans-serif.pdf</a>
      </p>

      <p class="noindent">
        <span class="download-description">EPUB:</span> <a href="https://www.the-bread-code.io/book.epub">https://www.the-bread-code.io/book.epub</a><br>
        <span class="download-description">EPUB black & white:</span> <a href="https://www.the-bread-code.io/bw-book.epub">https://www.the-bread-code.io/bw-book.epub</a><br>
      </p>

      <p class="noindent">
        <span class="download-description">Short TL;DR version:</span> <a href="https://the-bread-code.io/book-tldr-digital.pdf">https://the-bread-code.io/book-tldr-digital.pdf</a><br>
        <span class="download-description">Short TL;DR version (print):</span> <a href="https://the-bread-code.io/book-tldr-print.pdf">https://the-bread-code.io/book-tldr-print.pdf</a><br>
      </p>

      <p class="noindent">
        <span class="download-description">Sauce code:</span>
        <a href="https://www.github.com/hendricius/the-sourdough-framework">https://www.github.com/hendricius/the-sourdough-framework</a>. Contributions and improvements are highly appreciated!
      </p>
    </div>

    <p class="noindent">
      Thank you and may the gluten be strong with you,<br>
      Hendrik
    </p>
    }
  end

  # For some reason the list of figures and tables is displayed twice in the
  # menu. Fix this.
  def fix_list_of_tables_figures_duplicates(text)
    doc = build_doc(text)
    content = doc.css(".menu-items > .likechapterToc")
    content.each do |node|
      node.remove
    end
    doc.to_html
  end

  # The list of tables for some reason expands the menu on other pages? Fix
  # this.
  def fix_menus_list_figures_tables(text)
    doc = build_doc(text)
    content = doc.css(".menu-group .subsectionToc, .menu-group .sectionToc")
    content.each do |node|
      node.ancestors(".menu-entry")[0].remove
    end
    doc.to_html
  end

  # For some reason the links are not properly displayed and have odd color.
  # This repairs the html and css.
  def fix_list_of_figures_tables_display(text)
    doc = build_doc(text)
    content = doc.css(".main-content .TOC").remove_class("TOC")
    doc.to_html
  end

  # For some reason the dependency is missing a // in the url.
  def fix_js_dependency_link(text)
    text.gsub("https:/cdn.jsdelivr.net", "https://cdn.jsdelivr.net")
  end

  def build_doc(text)
    Nokogiri::HTML(text)
  end

  def add_anchors_to_headers(text)
    doc = build_doc(text)
    content = doc.css(".sectionHead, .subsectionHead")
    content.each do |el|
      anchor = el.attribute("id").value
      # No anchor for whatever reason
      next unless anchor

      copy_link = %Q{<a href="##{anchor}" class="permalink">🔗</a>}
      el.inner_html = "#{el.inner_html}#{copy_link}"
    end
    doc.to_html
  end

  # For some reason some of the links are broken in the conversion process.
  # They have https:/www and are missing a slash.
  def fix_https_links(text)
    text.gsub(/https:\/(?!\/)/, 'https://')
  end

  def fix_top_links(text)
    doc = build_doc(text)
    el = doc.css(".crosslinks-top")[0]
    el.remove if el
    doc.to_html
  end

  def remove_empty_menu_links(text)
    doc = build_doc(text)
    menus = doc.css(".menu-group")
    menus.each do |m|
      element = m.css("span.chapterToc")[0]
      next unless element
      if element.inner_html == "" || element.inner_html == " "
        m.remove
      end
    end
    doc.to_html
  end

  def insert_mobile_header_graphic(text)
    doc = build_doc(text)
    content = doc.css(".TOC.menu")[0]
    content.after('<div class="mobile-banner"><a href="/"><img src="banner.png" /></a></div>')
    doc.to_html
  end

  def fix_flowchart_background(text)
    doc = build_doc(text)
    images = doc.css("img")
    images.each do |img|
      src = img.attr("src")
      is_flowchart = src.include?(".svg")
      next unless is_flowchart
      img.parent.add_class("flowchart-image-wrapper")

    end
    doc.to_html
  end

  def fix_bottom_cross_links(text)
    doc = build_doc(text)
    link_cont = doc.css(".crosslinks-bottom")[0]
    return doc.to_html unless link_cont

    links = doc.css(".crosslinks-bottom a")
    prev_link = links.find {|l| l.inner_html == "prev" }
    next_link = links.find {|l| l.inner_html == "next" }
    prev_html = prev_link ? "<a class='prev' href='#{prev_link.attr('href')}'>Previous page</a>" : ''
    next_html = next_link ? "<a class='next' href='#{next_link.attr('href')}'>Next page</a>" : ''
    link_cont.inner_html = %Q{
      #{prev_html}
      #{next_html}
    }
    doc.to_html
  end
end

ModifyBuild.build
