Module: AtomicAssessmentsImport::ExamSoft::Chunker

Defined in:
lib/atomic_assessments_import/exam_soft/chunker.rb,
lib/atomic_assessments_import/exam_soft/chunker/strategy.rb,
lib/atomic_assessments_import/exam_soft/chunker/heading_split_strategy.rb,
lib/atomic_assessments_import/exam_soft/chunker/metadata_marker_strategy.rb,
lib/atomic_assessments_import/exam_soft/chunker/numbered_question_strategy.rb,
lib/atomic_assessments_import/exam_soft/chunker/horizontal_rule_split_strategy.rb

Defined Under Namespace

Classes: HeadingSplitStrategy, HorizontalRuleSplitStrategy, MetadataMarkerStrategy, NumberedQuestionStrategy, Strategy

Constant Summary collapse

STRATEGIES =
[
  MetadataMarkerStrategy,
  NumberedQuestionStrategy,
  HeadingSplitStrategy,
  HorizontalRuleSplitStrategy,
].freeze

Class Method Summary collapse

Class Method Details

.chunk(doc) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/atomic_assessments_import/exam_soft/chunker.rb', line 19

def self.chunk(doc)
  warnings = []

  STRATEGIES.each do |strategy_class|
    strategy = strategy_class.new
    chunks = strategy.split(doc)
    next if chunks.empty?

    return {
      chunks: chunks,
      header_nodes: strategy.header_nodes,
      warnings: warnings,
    }
  end

  # No strategy matched — return entire document as one chunk
  all_nodes = doc.children.reject { |n| n.text.strip.empty? && !n.name.match?(/^(img|table|hr)$/i) }
  warnings << "No chunking strategy matched. Treating entire document as a single question."

  {
    chunks: [all_nodes],
    header_nodes: [],
    warnings: warnings,
  }
end