Talk:Судьба/Ночь схватки:Чистка скриптов

From Baka-Tsuki
Revision as of 13:15, 1 September 2009 by Const2k (talk | contribs) (прокомментировал изменения скрипта на Python)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Скрипт на Python[edit]

Скрипт на Python, по-моему только word wrap убьет. Ещё нужно убивать всё что в квадратных скобках, а также все строки, начинающиеся на @ вместе с символом возврата каретки. Строки типа *page заменять убивать, н осимвол возврата каретки оставлять. --Rung 15:46, 11 May 2008 (PDT)


Скрипт мой, поэтому я отвечаю за свои слова: "сохраняющим только отображаемый текст из всех *.ks-файлов в каталоге, куда он помещен". Питон отличается высокой читабельностью кода, поэтому я не думал, что скрипт придется комментировать...

import os	#импорт необходимого модуля

def debrack(line):	#функция, вырезающая фрагменты между квадратными скобками в переданной ей строке
 start = line.find('[')
 end = line.find(']')
 if start == -1: return line
 if start < end: return line[:start]+line[end+1:]
 return ''

files = []	#инициализация списка для сбора *.ks-файлов
for file in os.listdir(os.getcwd()):	#обход списка всех файлов в каталоге со скриптом
 if file.endswith('.ks'): files.append(file)	#...и его фильтрация - выбор только *.ks-файлов
if len(files) == 0:
 print 'No *.ks file(-s) to decode in current directory!'	#*.ks-файлы в текущем каталоге не найдены
 exit()
for file in files:	#обработка каждого найденного *.ks-файла
 print file,	#сообщаем о начале обработки файла
 raw = open(file, 'rb')
 res = open(file.replace('.ks', '.txt'), 'wb')	#если такой *.txt-файл уже существует, он будет перезаписан!
 for line in raw:
  if line.find('\x00[\x00w\x00r\x00a\x00p\x00 \x00t\x00e\x00x\x00t\x00=\x00"\x00"\x00]') >= 0:
#отбираются только строки, начинающиеся с [wrap text=""]
   templine = debrack(line)	#из строки убирается первый фрагмент в квадратных скобках
   for i in range (1,100):	#макс.100 итераций (= макс.100 слов в строке) - защита от зацикливания
    newline = debrack(templine)	#из строки удаляется следующий фрагмент
    if newline == templine:	#если результат такой же, в строке скобок не осталось
     res.write(newline.replace('\x00', '')[2:])	#т.ч. сохряняем её, убрав все нулевые байты и два пробела в начале
     break
    else:	#был убран еще один фрагмент, поэтому обрабатываем строку дальше
     templine = newline	#постепенно оставляя в ней только текст
 raw.close()
 res.close()
 print '-> '+file.replace('.ks', '.txt')	#отчет пользователю, чтобы тот не заскучал

Скрипт писал исключительно для себя, поэтому рюшек типа обработки ошибок и справки не предусмотрено. Работоспособность проверена неоднократно на разных машинах.

Тем не менее, прошу сообщать сюда, если вдруг возникнут какие-либо проблемы. Например, я не знаю, есть ли в игре фразы в квадратных скобках (по идее, их быть не должно, но я не проверял) - если есть, при обработке они будут вырезаны.

Const2k 00:25, 12 May 2008 (PDT)


Проверил скрипт, он убивает вообще все символы возврата каретки промежуточные между строками. Нужно оставлят их между разными страницами в игре. Тэги *page и @pg указывают на смену страницы. --Rung 11:14, 12 May 2008 (PDT)


Обнаружил, что тэги могут быть вложенными, типа [word wrap="...[l]"]. Первая версия скрипта такие строки не обрабатывала, поэтому "фильтровалось" больше, чем нужно. Потери были минимальными (примерно 5 строк (5,06 строки) на мегабайт ks-скрипта или, в среднем, одна строка на пять *.ks-файлов), но если кто-то успел использовать скрипт для подготовки перевода, обновите ваши файлы. Также теперь сохраняются "линии" из дефисов (например, раньше вместо 'Wha---' сохранялось 'Wha'), и не сохраняются строки, состоящие только из двух двойных кавычек.

Кстати, скрипт и не должен был сохранять ничего, кроме текста и внутристрочного форматирования, но добавить лишний CR/LF не проблема. Сделал так, что вместо *page в результат пишется пустая строка:

if line.find('*page')+1: res.write('\r\n')

(четвертая снизу строчка скрипта). При желании любой может подогнать скрипт под себя: например, чтобы сохранять метки страниц в родном виде вместо их замены на новую строку, нужно вместо '\r\n' использовать line:

if line.find('*page')+1: res.write(line)

Const2k 13:52, 12 May 2008 (PDT)


Еще одно обновление. Теперь скрипт Unicode-совместим. Не исключено, что "сломалась" совместимость с древними не-Unicode ОС (типа Win98), но зато убрана необходимость использования японской локали для XP или переименования файлов. Получаемые текстовые файлы содержат самый минимум разметки, необходимый для возврата отфильтрованных тэгов на их место (при наличии оригинальных ks-файлов, откуда эти тэги будут браться). Разметка, будучи оформлена как комментарии, не отображается движком вики, поэтому никаких неудобств при чтении *.txt через вики не будет. "Восстанавливающий" скрипт выложу как только, так сразу.

Const2k 11:15, 1 September 2009 (UTC)