import sys

# -------------------------------------------------------------------------------- #

# -- FABRIQUE
# -- CREE LE MONTEUR APPROPRIE

class Factory:
  def getBuilder(self, mode):
    if mode == "html":
      return HTMLBuilder()
    elif mode == "txt":
      return TextBuilder()
    else:
      return TextBuilder()

# -------------------------------------------------------------------------------- #

# -- DIRECTEUR
# -- LANCE LE PROCESSUS DE CONVERSION
#
# Le directeur agit sur le monteur passé en paramètre
# pour le faire fonctionner correctement.
# A aucun moment le directeur sait quel processus de conversion
# est réalisé.

class Director:
  def __init__(self, builder):
    self.builder = builder

  def convert(self, filename):
    # ouverture des fichiers
    self.builder.open(filename + self.builder.getExtension())
    data = open(filename)
    c = data.read(1)
    buffer = ""

    # lecture du fichier
    while c != "":
      if c == '{':                          # instruction
        buffer = ""
      elif c == '}':                        # fin instruction
        self.builder.instruction(buffer)
      elif c == '[':                        # bloc de texte
        buffer = ""
      elif c == ']':                        # fin de bloc de texte
        self.builder.text(buffer)
      else:
        buffer = buffer + c
      c = data.read(1)

    # fermetures
    data.close()
    self.builder.close()

# -------------------------------------------------------------------------------- #

# La classe Builder définit le comportement abstrait de nos monteurs

class Builder:
  def open(self, filename):
    self.f = open(filename, "w")

  def close(self):
    self.f.close()

  def instruction(self, keyword):
    pass

  def text(self, str):
    pass

  def getExtension(self):
    return ""

# -------------------------------------------------------------------------------- #

# Le monteur HTML produit un document stylisé au format HTML

class HTMLBuilder(Builder):
  def open(self, filename):
    self.f = open(filename, "w")
    self.f.write("<html>\n<body>")
    self.tag = ""

  def close(self):
    if self.previousWasTag and len(self.tag) > 0:
      self.f.write("</" + self.tag + ">")
    self.f.write("</body>\n</html>")
    self.f.close()

  def instruction(self, keyword):
    if len(self.tag) > 0:
      self.f.write("</" + self.tag + ">")
    self.tag = ""
    self.previousWasTag = 1
    if keyword == "break":
      self.f.write("<br />\n")
    elif keyword == "indent":
      self.f.write("&nbsp;" * 8)
    elif keyword == "red":
      self.f.write('<font color="#FF0000">')
      self.tag = "font"
    elif keyword == "bold":
      self.f.write("<b>")
      self.tag = "b"
    elif keyword == "italic":
      self.f.write("<i>")
      self.tag = "i"
    elif keyword == "underline":
      self.f.write("<u>")
      self.tag = "u"

  def text(self, str):
    if not self.previousWasTag and len(self.tag) > 0:
      self.f.write("</" + self.tag + ">")
    self.f.write(" ".join(str.splitlines()))
    self.previousWasTag = 0

  def getExtension(self):
    return ".html"

# -------------------------------------------------------------------------------- #

# Le monteur texte crée un simple fichier texte en sortie. Seules quelques
# instructions se voient interprétées (indentation et saut de ligne)

class TextBuilder(Builder):
  def instruction(self, keyword):
    if keyword == "indent":
      self.f.write("\t");
    elif keyword == "break":
      self.f.write("\n");

  def text(self, str):
    self.f.write(" ".join(str.splitlines()))

  def getExtension(self):
    return ".txt"

# -------------------------------------------------------------------------------- #

if __name__ == '__main__':
  if len(sys.argv) < 3:
    print "processor [html | txt] [document.sd]"
    sys.exit()
  else:
    factory = Factory()
    doc = Director(factory.getBuilder(sys.argv[1]))
    doc.convert(sys.argv[2])
