# -*- coding: utf-8 -*-
'''Instract — скрипт для извлечения текста из исходных файлов .lua для интерпретатора INSTEAD.

Для получения справки по использованию вызовите скрипт с опцией -h: $ python instract.py -h
Выпуск: 1
Автор: Алексей Галкин
Год: 2023
Лицензия: MIT
'''

import argparse
import re

parser = argparse.ArgumentParser(description=
    '''
    Instract — скрипт для извлечения текста из исходных файлов .lua, для интерпретатора INSTEAD. Поддерживаются как файлы классического INSTEAD, так и Метапарсера.

    Скрипт извлекает все строки, содержащиеся в двойных и одинарных кавычках, в комментариях, а также между двойными квадратными скобками и копирует их в отдельный файл. Список строк формируется в том порядке в котором они следуют в исходном файле. Дублетные строки удаляются. Таким образом, в конечный файл попадает только текст без операторов и языковых конструкций Lua. В дальнейшем его можно использовать, например, для проверки правописания.

    По-умолчанию, в список не попадают строки, не содержащие кириллические символы (атрибуты объектов, названия модулей и т.п.). Если в вашем проекте есть блоки текста целиком на иностранном языке и вы хотите, чтобы они тоже попали в список вызывайте скрипт с опцией -a (--all).
    
    Пример использования: $ python instract.py main3.lua
''',
    formatter_class=argparse.RawTextHelpFormatter,
    epilog='Алексей Галкин, 2023. Выпуск 1. Лицензия MIT.'
)
parser.add_argument(
    'source',
    type=str,
    help='расположение исходного файла .lua'
)
parser.add_argument(
    'destination',
    type=str,
    nargs='?',
    help='имя файла, в который будет сохранён текст (по-умолчанию — "extract.txt")',
    default='extract.txt'
)
parser.add_argument(
    '-a',
    '--all',
    help='выводить все текстовые строки, в т.ч. без кириллицы',
    action='store_true'
)

args = parser.parse_args()

with open(args.source, 'r', encoding='utf-8') as f:
    text = f.read()

text_list = re.findall(
    '\"([^\"]*)\"|' # двойные кавычки
    '\'([^\']*)\'|' # одинарные кавычки
    '\[\[(.*?)\]\]|' # блочный текст в двойных квадратных скобках
    '--(.*?)\\n', # строчный комментарий
    text,
    re.DOTALL
)

text_list = ['\n'.join(element) for element in text_list]

# Удаляем дублетные элементы
dictionary = dict.fromkeys(text_list)
text_list = list(dictionary)

# Удаляем элементы без кириллицы, если не выставлена опция -a
if not args.all:
    text_list = [element for element in text_list if re.compile(r'[а-яА-Я]').search(element)]

with open(args.destination, 'w', encoding='utf-8') as f:
    f.write(''.join(text_list).replace('\n\n', '\n').replace('^', ''))