lib/hs/loaders/chapter_loader.rb in hs-cli-0.2.2 vs lib/hs/loaders/chapter_loader.rb in hs-cli-0.3.0

- old
+ new

@@ -6,37 +6,43 @@ module HS module ChapterLoader include HS::XMLParser include HS::ElementLoader - def load_chapter(course, xml) - create_chapter(course, parse_xml(xml)) + CUSTOM_LOADERS = %i[title intro modules].freeze + + def load_chapter(course, xml, &block) + create_chapter(course, parse_xml(xml), &block) end private - def create_chapter(course, data) # rubocop:disable Metrics/MethodLength - chapter = HS::Chapter.new( - course, - slug: data[:slug], - review_status: data[:review_status] - ) + def create_chapter(course, data, &block) + chapter = HS::Chapter.new(course, data.slice(:slug, :review_status)) + data[:_children].each { |child| load_a_part(chapter, child, &block) } + chapter + end - data[:_children].each do |child| - case child[:_name] - when :title - chapter.title = get_text(child) - when :intro - chapter.intro = load_element(child) - when :modules - # TODO: extract :modules - nil - else - element = load_element(child) - chapter.content << element if element - end + def load_a_part(chapter, child, &block) + if CUSTOM_LOADERS.include?(child[:_name]) + send("load_#{child[:_name]}", chapter, child, &block) + else + element = load_element(child) + chapter.content << element if element end + end - chapter + def load_title(chapter, child) + chapter.title = get_text(child) + end + + def load_intro(chapter, child) + chapter.intro = load_element(child) + end + + def load_modules(chapter, child) + return unless block_given? + files = child[:_children].map { |m| m[:file] }.compact + files.each { |file| yield chapter, file } end end end