module Harby

module Grammar
        grammar String
                rule string
                        double_quoted / single_quoted / naked
                end

                rule double_quote
                        '"' / '“' / '”'
                end

                rule escaped_double_quote
                        '\\' double_quote
                end

                rule double_quoted
                        double_quote value:(escaped_double_quote / command / !double_quote .)* double_quote {
                                def parsed_value
                                        value.elements.map do |element|
                                                if element.respond_to?(:parsed_value)
                                                        element.parsed_value
                                                else
                                                        element.text_value.gsub /\\(["“”])/, '\1'
                                                end
                                        end.join ''
                                end
                        }
                end

                rule single_quote
                        "'" / '‘' / '’'
                end

                rule escaped_single_quote
                        '\\' single_quote
                end

                rule single_quoted
                        single_quote value:(escaped_single_quote / !single_quote .)* single_quote {
                                def parsed_value
                                        value.text_value.gsub /\\(['‘’])/, '\1'
                                end
                        }
                end

                rule naked
                        ('\\ ' / !' ' !']' !')' .)+ {
                                def parsed_value
                                        text_value.gsub('\\ ', ' ').gsub '\\/', '/'
                                end
                        }
                end
        end
end

end