module ResumeTools

grammar ResumeGrammar

  rule document
    ((contact_data / section / period / period_data / item / para / data) / LF)*
  end

  rule period_data
    period_org / period_loc / period_dates / period_detail
  end

  rule period_org
    period_detail_marker "O" whitespace content:text LF+ {
      def data_type
        :period_organization
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Organization: " + value
      end
    }
  end

  rule period_loc
    period_detail_marker "L" whitespace content:text LF+ {
      def data_type
        :period_location
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Location: " + value
      end
    }
  end

  rule period_dates
    period_detail_marker "D" whitespace content:text LF+ {
      def data_type
        :period_dates
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Dates: " + value
      end
    }
  end

  rule contact_data
    contact_name / contact_telephone / contact_email / contact_address / 
    contact_url / contact_detail
  end

  rule contact_url
    contact_marker "U" whitespace content:text LF+ {
      def data_type
        :contact_url
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Contact URL: " + value
      end
    }
  end

  rule contact_address
    contact_marker "A" whitespace content:text LF+ {
      def data_type
        :contact_address
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Contact address: " + value
      end
    }
  end

  rule contact_telephone
    contact_marker "T" whitespace content:text LF+ {
      def data_type
        :contact_telephone
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Contact telephone: " + value
      end
    }
  end

  rule contact_email
    contact_marker "E" whitespace content:text LF+ {
      def data_type
        :contact_email
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Contact e-mail: " + value
      end
    }
  end

  rule contact_telephone
    contact_marker "T" whitespace content:text LF+ {
      def data_type
        :contact_telephone
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Contact telephone: " + value
      end
    }
  end

  rule contact_name
    contact_marker "N" whitespace content:text LF+ {
      def data_type
        :contact_name
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Contact name: " + value
      end
    }
  end

  rule item
    item_marker whitespace content:(item_data+) {
      def data_type
        :item
      end

      def value
        content.text_value.gsub("\n", ' ').gsub("\t", ' ').squeeze(" ").strip
      end

      def inspect
        "Item: " + value[0..100]
      end
    }
  end

  rule item_data
    continuation content:text LF+ {
      def inspect
        content.text_value
      end
    }
  end

  rule continuation
    [^-=>#+\n]
  end

  rule period_detail
    period_detail_marker whitespace content:text LF+ {
      def data_type
        :period_detail
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Detail: " + value
      end
    }
  end

  rule period
    period_marker whitespace content:text LF {
      def data_type
        :period
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Period: " + value
      end
    }
  end

  rule para
    para_marker LF
    content:(!("---") text LF)*
    para_marker LF+ {
      def data_type
        :paragraph
      end

      def value
        content.text_value.gsub(/\n/, ' ').squeeze(" ").strip
      end

      def inspect
        "Paragraph: " + value[0..100]
      end
    }
  end

  rule section
    section_marker whitespace content:text LF+ {
      def data_type
        :section
      end

      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Section: " + elements[2].text_value
      end
    }
  end

  rule contact_detail
    contact_marker whitespace content:text LF {
      def data_type
        :contact_detail
      end
      def value
        content.text_value.squeeze(" ").strip
      end

      def inspect
        "Contact detail: " + value
      end
    }
  end

  rule data
    content:(text) LF {
      def data_type
        :untyped
      end

      def value
        content.text_value
      end

      def inspect
        "Data: \"" + value[0..100] + "\""
      end
    }
  end

  rule text
    ([^\n])+ {
      def value
        text_value
      end

      def inspect
        "Line: " + value
      end
    }
  end

  rule LF
    [\n] {
      def data_type
        nil
      end

      def value
        ""
      end

      def inspect
        value
      end
    }
  end

  rule whitespace
    [\t ]
  end

  rule contact_marker
    "#" {
      def value
        nil
      end

      def inspect
        "#"
      end
    }
  end

  rule item_marker
    "-" {
      def value
        nil
      end

      def inspect
        "-"
      end
    }
  end

  rule section_marker
    "=" {
      def value
        nil
      end

      def inspect
        "="
      end
    }
  end

  rule period_marker
    "+" {
      def value
        nil
      end

      def inspect
        "+"
      end
    }
  end

  rule period_detail_marker
    ">" {
      def value
        nil
      end

      def inspect
        ">"
      end
    }
  end

  rule para_marker
    "---" {
      def value
        nil
      end

      def inspect
        "---"
      end
    }
  end

end # grammar ResumeGrammar

end # module ResumeTools