text: # -*- coding: utf-8 -*-
  #
  # Copyright 2017 Mycroft AI Inc.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #    http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  #
  """
      Parse functions for spanish (es)
      TODO: numbers greater than 999999
  """
  
  
  # Undefined articles ["un", "una", "unos", "unas"] can not be supressed,
  # in Spanish, "un caballo" means "a horse" or "one horse".
  es_articles = ["el", "la", "los", "las"]
  
  es_numbers_xlat = {
      "un": 1,
      "uno": 1,
      "una": 1,
      "dos": 2,
      "tres": 3,
      u"trés": 3,
      "cuatro": 4,
      "cinco": 5,
      "seis": 6,
      "siete": 7,
      "ocho": 8,
      "nueve": 9,
      "diez": 10,
      "once": 11,
      "doce": 12,
      "trece": 13,
      "catorce": 14,
      "quince": 15,
      "dieciseis": 16,
      u"dieciséis": 16,
      "diecisiete": 17,
      "dieciocho": 18,
      "diecinueve": 19,
      "veinte": 20,
      "veintiuno": 21,
      u"veintidï¿½s": 22,
      u"veintitrï¿½s": 23,
      "veintidos": 22,
      "veintitres": 23,
      u"veintitrés": 23,
      "veinticuatro": 24,
      "veinticinco": 25,
      u"veintiséis": 26,
      "veintiseis": 26,
      "veintisiete": 27,
      "veintiocho": 28,
      "veintinueve": 29,
      "treinta": 30,
      "cuarenta": 40,
      "cincuenta": 50,
      "sesenta": 60,
      "setenta": 70,
      "ochenta": 80,
      "noventa": 90,
      "cien": 100,
      "ciento": 100,
      "doscientos": 200,
      "doscientas": 200,
      "trescientos": 300,
      "trescientas": 300,
      "cuatrocientos": 400,
      "cuatrocientas": 400,
      "quinientos": 500,
      "quinientas": 500,
      "seiscientos": 600,
      "seiscientas": 600,
      "setecientos": 700,
      "setecientas": 700,
      "ochocientos": 800,
      "ochocientas": 800,
      "novecientos": 900,
      "novecientas": 900}
  
  
  def es_parse(words, i):
      def es_cte(i, s):
          if i < len(words) and s == words[i]:
              return s, i + 1
          return None
  
      def es_number_word(i, mi, ma):
          if i < len(words):
              v = es_numbers_xlat.get(words[i])
              if v and v >= mi and v <= ma:
                  return v, i + 1
          return None
  
      def es_number_1_99(i):
          r1 = es_number_word(i, 1, 29)
          if r1:
              return r1
  
          r1 = es_number_word(i, 30, 90)
          if r1:
              v1, i1 = r1
              r2 = es_cte(i1, "y")
              if r2:
                  i2 = r2[1]
                  r3 = es_number_word(i2, 1, 9)
                  if r3:
                      v3, i3 = r3
                      return v1 + v3, i3
              return r1
          return None
  
      def es_number_1_999(i):
          # [2-9]cientos [1-99]?
          r1 = es_number_word(i, 100, 900)
          if r1:
              v1, i1 = r1
              r2 = es_number_1_99(i1)
              if r2:
                  v2, i2 = r2
                  return v1 + v2, i2
              else:
                  return r1
  
          # [1-99]
          r1 = es_number_1_99(i)
          if r1:
              return r1
  
          return None
  
      def es_number(i):
          # check for cero
          r1 = es_number_word(i, 0, 0)
          if r1:
              return r1
  
          # check for [1-999] (mil [0-999])?
          r1 = es_number_1_999(i)
          if r1:
              v1, i1 = r1
              r2 = es_cte(i1, "mil")
              if r2:
                  i2 = r2[1]
                  r3 = es_number_1_999(i2)
                  if r3:
                      v3, i3 = r3
                      return v1 * 1000 + v3, i3
                  else:
                      return v1 * 1000, i2
              else:
                  return r1
          return None
  
      return es_number(i)
  
  
  def normalize_es(text, remove_articles):
      """ Spanish string normalization """
  
      words = text.split()  # this also removed extra spaces
  
      normalized = ""
      i = 0
      while i < len(words):
          word = words[i]
  
          if remove_articles and word in es_articles:
              i += 1
              continue
  
          # Convert numbers into digits
          r = es_parse(words, i)
          if r:
              v, i = r
              normalized += " " + str(v)
              continue
  
          normalized += " " + word
          i += 1
  
      return normalized[1:]  # strip the initial space
  