#! /usr/bin/env python3
# пример препроцессинга для RIAN
# 
#startoftext
#ГОР.ЛИНИЯ_1
#     49301854
#     *Проект "ЛитРес" с 13 анонимными детективами запустят 17 февраля*
#     #Проект "ЛитРес" с 13 анонимными детективами запустят 17 февраля#
#     МОСКВА, 15 фев - РИА Новости. Издательская платформа книжного сервиса "ЛитРес" запускает проект "Анонимyс", он включает в себя 13 детективных романов, авторство которых не раскроют до выхода последней истории, сообщает пресс-служба сервиса.
#     "В четверг 17 февраля "ЛитРес:Издательство" запускает проект "Анонимyс" — в него войдут 13 детективных романов, написанных анонимными авторами. Каждая книга будет выходит раз в два месяца, все они связаны между собой главными героями и сюжетной линией, но написаны инкогнито: кто создал эти романы — один человек или творческий коллектив писателей — останется в тайне до момента выхода заключительной книги серии в 2023 году", — говорится в сообщении.
#     По словам представителей пресс-службы, цель проекта заключается в том, чтобы позволить книгам "говорить самим за себя, а читателям — не отвлекаться на маски и доверять тексту".
#     "Впервые в истории современной российской литературы перед читателем — проект-трикстер. Под этим заголовком, как под маской, прячется автор, или авторы, возможно, всемирно известный. Читателю предстоит самому отгадать, кто создатель детективных историй", — приводит пресс-служба слова директора департамента по развитию контента группы компаний "ЛитРес" Евгения Селиванова.
#     Открывает серию романов исторический детектив "Дело Зили-султана", события которого разворачиваются в разных эпохах. В наши дни старшему следователю Оресту Волину необходимо разобраться в происшествии, из-за которого могла погибнуть популярная певица. В ходе расследования сыщик обнаруживает ящик с дневниками, датированными 1918 годом и повествующими о событиях 1886 года. Они перенесут Волина из России в загадочную Персию и позволят погрузиться во все перипетии восточного царства.
#     Книга выйдет 17 февраля на сервисе "ЛитРес" одновременно в электронной и аудиоверсии. Аудиоформат озвучил актер театра и кино, народный артист РФ Александр Клюквин, известный как голос Аластора Грюма в фильме "Гарри Поттер и Орден Феникса" и голос Роберта де Ниро в российском дубляже фильмов. В бумажной версии книга выйдет в марте.-0-
#
#     15/02/22 14:54:44.00
#
#
#endoftext
#
# строка *Проект "ЛитРес" с 13 анонимными детективами запустят 17 февраля* - это название
# строка #Проект "ЛитРес" с 13 анонимными детективами запустят 17 февраля# - это комментарий
# все дальнейшие строки до символов -0- - это сообщение
# 
#

import sys, os

skip_empty = True # пропускать пустые строки
skip_first = 3 # пропустить первые строки
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)
    
    # для всех строк в диапазоне от skip_first до (len(lines) - skip_last - skip_first)
    for i in range(skip_first, len(lines) - skip_last - skip_first):
        #print("line[" + str(i) +"]="+lines[i] + '\n')
        # пропускаем пустые строки
        if len(lines[i]) < 1 and skip_empty: continue
        
        # сохраняем name ( строка заключена в * * )
        if (len(name) < 1) and lines[i].rstrip().endswith('*') and lines[i].lstrip().startswith('*'): 
            name = lines[i].strip().strip('*') # убираем пробелы и '*' в начале и конце строки и
            #print(name)
            continue

        # сохраняем comment  ( строка заключена в # # )
        if (len(comment) < 1) and lines[i].rstrip().endswith('#') and lines[i].lstrip().startswith('#'): 
            comment = lines[i].strip().strip('#') # убираем пробелы и '#' в начале и конце строки и
            #print(comment)
            continue

        # сохраняем/дополняем в body все строки, ищем -0- для конца сообщения
        end = lines[i].find('-0-')
        if end < 0: 
            body += lines[i] + '\n'
        else:
            #line = lines[i][0: end]
            #print(line)
            body += lines[i][0: end]
            
    # по требованию к 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()
