#!/usr/bin/env ruby # frozen_string_literal: true require 'sanitize' require 'thor' class Syllabus def initialize @entries = [] end def add(level, content) # puts "Adding L#{level} - #{content}" entry = @entries.last.clone || [] entry[level] = content @entries.push entry end def display_entry(level, value, addspace=false) case level when 0 then puts "# #{value}\n\n" when 1 then puts "## #{value}\n\n" when 2 then puts "* #{value}\n" else puts ' ' * (level - 2) + value end puts '\n' if addspace end def display old_entry = nil old_level = 0 @entries.each do |entry| entry.each.with_index do |val, level| next if val.nil? # TODO: detect inconsistensy next if !old_entry.nil? && old_entry[level] == val display_entry(level, val, (old_level > level)) end old_entry = entry end end def syllabus_file(filename) File.readlines(filename).each do |line| next unless line =~ /^(#+)\s+(.*)\n/ level = ($1.size - 1) content = Sanitize.clean($2) add(level, content) end end def syllabus_dir(dir) Dir[dir + '/**/*.md'].sort.each do |name| syllabus_file(name) end end end class SyllabusCli < Thor desc 'extract DIR', 'Extract data from DIR' def extract dir s = Syllabus.new s.syllabus_dir(dir) s.display end end SyllabusCli.start(ARGV)