#! /usr/bin/env python3
# пример препроцессинга для TASS
# 
# '\01'TAS001 3 ИНФ 0273 ТАСС 10A00 ИНОА РУ
# МИД-НАТО
#'\02'УКРАИНА: МИД-НАТО-ЧЛЕНСТВО-1
# '\14'  Отказ Украины от вступления в НАТО позволил бы европейцам вздохнуть с 
#облегчением - Лавров
# '\14'  /Обновлено, добавлена информация после третьего абзаца/
# '\14'  
# '\14'  МОСКВА, 15 февраля. /ТАСС/. Отказ Киева от членства в НАТО позволил бы 
#многим европейским странам вздохнуть с облегчением. Об этом заявил во вторник 
#.......
#для оправдания таких заявлений и предупредил, что попытки силового решения 
#кризиса на юго-востоке Украины будут иметь самые серьезные последствия. 
#--0--**
# '\03'151450 ФЕВ 22'\04'
# 
#

import sys, os

skip_empty = True # пропускать пустые строки
skip_first = 2 # пропустить первые строки
skip_last = 1 # пропустить последние строки

def main():
    name = '' # сюда будем писать название
    comment = '' # сюда будем писать комментарии
    body = '' # сюда будем писать тело
    hasBOM = False # присутствует ли заголовок utf-8 в файле

    # получим имя файла из командной строки
    filename = sys.argv[1] if len(sys.argv) > 1 else None
    # если имя пустое - выходим
    if filename is None: return
    #print("filename=" + filename + "\n")
    
    # открываем файл для чтения как бинарный (НЕ Текстовый)
    # (это всегда файл в кодировке utf-8, может содержать заголовок BOM_UTF8) 
    with open(filename, "rb") as fin:
        # читаем данные, закрываем файл
        message = fin.read(); fin.close()
        
    # проверяем, есть ли заголок BOM_UTF8 (первые 3 байта)
    if message.startswith(b'\xef\xbb\xbf'):
        hasBOM = True # сохраняем флаг наличия заголовка
        message = message[3:] # пропускаем первые 3 байта 

    # создаем список строк из message, для этого
    # декодируем из utf-8
    # заменяем символы \r\n (возврат каретки и переход на новуб строку) на \n
    # разделяем message на строки
    lines = message.decode(encoding="utf-8").replace("\r\n", "\n").split("\n")
    #print(lines)

    body_start = False # флаг конца comment / начала сохранения body
    # для всех строк в диапазоне от skip_first до (len(lines) - skip_last - skip_first)
    for i in range(skip_first, len(lines) - skip_last - skip_first):

        line = lines[i]

        # сохраняем name ( строка начинается с символа '\02' )
        if line.startswith('\x02') :
            print("begin name")
            # убираем пробелы в начале и конце строки и символ '\02'
            name = line[1:].strip() 
            print(name)
            continue
        
        if line.startswith('\x14') :
            print("begin paragraph")
            line = line[1:]
            if len(line.strip()) < 1:
                body_start = True
                print("begin body")
                continue

        # пропускаем пустые строки
        if len(line.strip()) < 1 and skip_empty: continue
            
        # сохраняем/добавляем comment (все строки после названия до пустого параграфа)
        # т.е. пока body_start не станет True
        if body_start == False:
            # удаляем пробелы 
            comment += line.strip() + '\n'
            continue

        # сохраняем/дополняем в body все строки, ищем --0-- для конца сообщения
        end = line.find('--0--')
        if end < 0: 
            body += line + '\n'
        else:
            body += line[0: end]
            break

    # удалить последние символы \n из comment и body
    comment = comment.rstrip('\n');
    body = body.rstrip('\n');
         
    # по требованию к JSON формату преобразовываем управляющие символы
    # \n to \\n, \ на \\, ' на \', " на \" и т.д.
    name = name.replace('\\', '\\\\').replace('\n', '\\n').replace('\'', "\\'").replace('\"', '\\"').replace('\t', '\\t').replace('\/', '\\/')
    comment = comment.replace('\\', '\\\\').replace('\n', '\\n').replace('\'', "\\'").replace('\"', '\\"').replace('\t', '\\t').replace('\/', '\\/')
    body = body.replace('\\', '\\\\').replace('\n', '\\n').replace('\'', "\\'").replace('\"', '\\"').replace('\t', '\\t').replace('\/', '\\/')

    # открываем тот же самый файл для записи в бинарном формате
    # будем записывать в JSON формате
    fout = open(filename, "wb")
    # если флаг hasBOM установлен -> записываем заголовок
    if hasBOM == True : fout.write(b'\xef\xbb\xbf')
    # записываем name, закодировав в utf-8
    fout.write(b'{"name":"' + name.encode(encoding="utf-8") + b'",')
    # записываем comment (или subject)
    fout.write(b'"subject":"' + comment.encode(encoding="utf-8") + b'",')
    # записываем текст body
    fout.write(b'"body":"' + body.encode(encoding="utf-8") + b'"}')
    # закрываем файл                
    fout.close()

if __name__ == '__main__':
    main()
