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