class Work::Md::Commands::Parse

Public Class Methods

execute(argv = []) click to toggle source
# File lib/work/md/commands/parse.rb, line 8
def execute(argv = [])
  parsed_file_path = Work::Md::Config.work_dir + '/parsed.md'
  t = Work::Md::Config.translations

  parser = Work::Md::Parser::Engine.new
  args_hash_to_parser = -> (args, received_parser) {
    year = args['y'] || Time.new.year
    month = args['m'] || Time.new.month

    month = "0#{month.to_i}" if month.to_i < 10

    add_file_to_parser = lambda do |day|
      day = "0#{day.to_i}" if day.to_i < 10

      file_name = Work::Md::Config.work_dir + "/#{year}/#{month}/#{day}.md"

      received_parser.add_file(file_name)
    end

    if args['d'].include?('..')
      range = args['d'].split('..')

      (range[0].to_i..range[1].to_i).each { |day| add_file_to_parser.call(day) }
    else
      args['d'].split(',').each { |day| add_file_to_parser.call(day) }
    end

    received_parser
  }

  argv.join('#').split('#and#').map { |v| v.split("#") }.each do |args|
    args_hash = Hash[args.join(' ').scan(/-?([^=\s]+)(?:=(\S+))?/)]
    args_hash_to_parser.(args_hash, parser)
  end

  parser.freeze

  ::File.delete(parsed_file_path) if ::File.exist? parsed_file_path

  ::File.open(parsed_file_path, 'w+') do |f|
    f.puts("# #{Work::Md::Config.title}\n\n")
    f.puts("### #{t[:tasks]} (#{parser.tasks.size}):\n\n")
    parser.tasks.each do |task|
      f.puts("- [#{task}\n\n") if task != ' ]'
    end
    f.puts("---\n\n")
    f.puts("### #{t[:meetings]} (#{parser.meetings.size}):\n\n")
    parser.meetings.each do |meeting|
      f.puts("- [#{meeting}\n\n") if meeting != ' ]'
    end
    f.puts("---\n\n")
    f.puts("### #{t[:interruptions]} (#{parser.interruptions.size}):\n\n")
    parser.interruptions.each do |interruption|
      f.puts("- #{interruption}\n")
    end
    f.puts("\n") if parser.interruptions.size > 0
    f.puts("---\n\n")
    f.puts("### #{t[:difficulties]} (#{parser.difficulties.size}):\n\n")
    parser.difficulties.each do |difficulty|
      f.puts("- #{difficulty}\n")
    end
    f.puts("\n") if parser.difficulties.size > 0
    f.puts("---\n\n")
    f.puts("### #{t[:observations]} (#{parser.observations.size}):\n\n")
    parser.observations.each do |observation|
      f.puts("- #{observation}\n")
    end
    f.puts("\n") if parser.observations.size > 0
    f.puts("---\n\n")
    f.puts("### #{t[:pomodoros]} (#{parser.average_pomodoros} #{t[:per_day]}):\n\n")
    f.puts("**#{t[:total]}: #{parser.pomodoros_sum}**")
    f.puts("\n")
    parser.pomodoros_bars.each do |pomodoro_bar|
      f.puts(pomodoro_bar)
      f.puts("\n")
    end
    f.puts("---\n\n")
    f.puts("### #{t[:days_bars]}:\n\n")
    f.puts("**#{t[:pomodoros]}: ⬛ | #{t[:meetings]}: 📅 | #{t[:interruptions]}: ⚠️ | #{t[:difficulties]}: 😓 | #{t[:observations]}: 📝 | #{t[:tasks]}: ✔️**")

    f.puts("\n")
    parser.days_bars.each do |day_bar|
      f.puts(day_bar)
      f.puts("\n")
    end

    f.puts("\n\n")
  end

  Work::Md::File.open_in_editor([parsed_file_path])
rescue StandardError => e
  Work::Md::Cli.help(
    ::TTY::Box.frame(
      "message: #{e.message}",
      '',
      'Usage examples:',
      '',
      'work-md parse -d=1 -m=5 -y=2000 | get day 1 from month 5 and year 2000',
      'work-md parse -d=1,2,3          | get day 1, 2 and 3 from the current month and year',
      'work-md parse -d=1,2 -m=4       | get day 1 and 2 from month 4 and current year',
      'work-md parse -d=1..10 -m=4     | get day 1 to 10 from month 4 and current year',
      **Work::Md::Cli.error_frame_style
    )
  )
end