class TxtTabToLatexProcessor:
    def __init__(self):
        self.mark_word_op = {
            '<title>': self._set_title_mode,
            '</title>': self._unset_mode,
            '<text>': self._set_text_mode,
            '</text>': self._unset_mode,
            '<tab>': self._set_tab_mode,
            '</tab>': self._unset_mode,
        }
        self.content = None
        self.text_writer = None

    def _set_title_mode(self, *args):
        self.text_writer = TitleModeWriter(self.content)

    def _set_text_mode(self, *args):
        self.text_writer = TextModeWriter(self.content)

    def _set_tab_mode(self, *args):
        self.text_writer = TabModeWriter(self.content)

    def _unset_mode(self, line, line_number):
        if not self.text_writer:
            raise ModeNotSetException(line, line_number)

        self.text_writer.close_mode()
        self.text_writer = None

    def process(self, file_path):
        self.content = Content()
        raw_content = self._get_content_as_lines_list(file_path)

        self._write_content(raw_content)

        content_splitter = ContentSplitter(self.content)
        result = content_splitter.split()
        return result.get_string() + NEWPAGE_MARK

    def _write_content(self, content):
        for line_number, line in enumerate(content):
            if line in self.mark_word_op.keys():
                self.mark_word_op[line](line, line_number)
            elif self.text_writer:
                line = self.text_writer.preprocess_line(line, line_number)
                self.text_writer.write(line)

    @staticmethod
    def _get_content_as_lines_list(file_path):
        print 'Processing file: ' + file_path
        f = open(file_path, 'r')
        content = f.read()
        return content.split('\n')
 def _set_tab_mode(self, *args):
     self.text_writer = TabModeWriter(self.content)
 def _set_text_mode(self, *args):
     self.text_writer = TextModeWriter(self.content)
 def _set_title_mode(self, *args):
     self.text_writer = TitleModeWriter(self.content)