#{version}
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 ModifyBuild HOST = "https://www.the-sourdough-framework.com".freeze def self.build new.build end def build build_latex_html create_sitemap 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") 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_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 = mark_menu_as_selected_if_on_page(text, extract_file_from_path(filename)) 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 = 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_list_figures_tables?(filename) ["listfigurename.html", "listtablename.html", "listoflocname.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 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{ #{chapter_number_or_nothing} #{link_text} } hyperlink_node.inner_html = link_node_content content = hyperlink_node.to_s end n.inner_html = content end doc.to_html 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}
} 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} } nav.inner_html = nav_content doc.to_html end def menu_mobile_nav %Q{ 🍞 The Sourdough Framework } 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{
#{version}
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.
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 as a free digital download.
However, 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 through a donation or by considering the purchase of the hardcover version of this book.
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.
If you feel inspired to contribute, please consider making a donation of any amount through my donation page. Your support will go a long way in ensuring that this knowledge can reach even more bread enthusiasts worldwide.
Remember, 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.
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.
You can either browse through this page or download the full book directly:
PDF: https://www.the-bread-code.io/book.pdf
PDF (no serif): https://www.the-bread-code.io/book-sans-serif.pdf
EPUB: https://www.the-bread-code.io/book.epub
EPUB in Black & White, size optimized for screen readers : https://www.the-bread-code.io/bw-book.epub
The full source code of the book can be found here: https://www.github.com/hendricius/the-sourdough-framework
There's also a hardcover version of the book available featuring an even more awesome design. You can read more information here: https://www.breadco.de/hardcover-book
Thank you and may the gluten be strong with you,
Hendrik