Sha256: 8a59f02efa19e3da97eb3ac04b3c3476a8a59063b27a9ebfa8221994f69e3db8

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

require "active_support/core_ext/module"
module Himekaminize
  module Nodes
    class Task < BaseNode
      INCOMPLETE_PATTERN = /[-+*]\s\[\s\]\s/
      COMPLETE_PATTERN = /[-+*]\s\[[xX]\]\s/

      INCOMPLETE_MD = '- [ ]'.freeze
      COMPLETE_MD = '- [x]'.freeze
      attr_accessor :name, :status, :seq, :space, :depth, :parent_seq
      alias_attribute :sequence, :seq

      COMPLETE_STATUSE = :complete
      INCOMPLETE_STATUSE = :incomplete
      STATUSES = %I(#{COMPLETE_STATUSE} #{INCOMPLETE_STATUSE})

      def initialize(line, seq)
        @seq = seq
        @status, @name, @space = split_name_and_status(line)
        @depth, @parent_seq = 0, nil if @space.length == 0
      end

      def to_s
        status_str = @status == COMPLETE_STATUSE ? COMPLETE_MD : INCOMPLETE_MD
        sprintf("%s%s %s\n", @space, status_str, @name)
      end

      def update_status(status)
        return false unless STATUSES.include?(status)
        @status = status
      end

      def parent?(a)
        return false unless a.is_a?(self.class)
        @space.length - 4 <= a.space.length && a.space.length <= @space.length - 1
      end

      def none_parent?
        @depth == 0 || @seq == 1
      end

      private
      def split_name_and_status(line)
        /\A(\s*)(#{INCOMPLETE_PATTERN}|#{COMPLETE_PATTERN})(.*)/.match(line) do |m|
          if m[2] =~ /#{INCOMPLETE_PATTERN}/
            return [INCOMPLETE_STATUSE, m[3], m[1]]
          else
            return [COMPLETE_STATUSE, m[3], m[1]]
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
himekaminize-0.1.0 lib/himekaminize/nodes/task.rb