Difference between revisions of "Судьба/Ночь схватки:Чистка скриптов"

From Baka-Tsuki
Jump to navigation Jump to search
m (little improvements of Python script / слегка улучшил скрипт на Python)
m (улучшил вывод в консоль / better console output)
 
(4 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
Расшифрованные *.ks-файлы содержат, наряду с собственно текстом, служебную информацию (например, для корректной разбивки фразы на слова при переносе). Для того чтобы убрать эту информацию из файла и получить текст в "читабельном" виде, можно воспользоваться следующими вариантами:
 
Расшифрованные *.ks-файлы содержат, наряду с собственно текстом, служебную информацию (например, для корректной разбивки фразы на слова при переносе). Для того чтобы убрать эту информацию из файла и получить текст в "читабельном" виде, можно воспользоваться следующими вариантами:
 
*макрос для MS Word 2003 (для обработки текста в отдельном документе Word)
 
*макрос для MS Word 2003 (для обработки текста в отдельном документе Word)
*скрипт на Python (для обработки всех *.ks-файлов в отдельном каталоге)
+
*скрипт на Python (для обработки всех *.ks-файлов в отдельном каталоге) <font color="red">обновлен 2009-09-01</font>
   
 
==Макрос для MS Word 2003==
 
==Макрос для MS Word 2003==
Line 202: Line 202:
   
 
==Скрипт на Python==
 
==Скрипт на Python==
Также можно воспользоваться скриптом, сохраняющим только отображаемый текст из всех *.ks-файлов в каталоге, куда он помещен. Полученный текст сохраняется в соответствующие *.txt-файлы в том же каталоге. Сохраните нижеприведенный код в текстовый файл (*.txt), переименуйте его в *.py и поместите в каталог с файлами, подлежащими обработке. Если у вас установлен Python, *.py-файлы можно запускать так же, как и другие программы.
+
Также можно воспользоваться скриптом, сохраняющим отображаемый текст и минимум разметки (название файла и номера страниц) из всех *.ks-файлов в каталоге, куда он помещен. Полученный текст сохраняется в соответствующие *.txt-файлы в том же каталоге. Поскольку разметка сделана в виде комментариев, движок вики показывает их только в режиме редактирования. Это позволяет "скопипастить" готовый *.txt в вики, сохранить/"предпросмотреть" его, и читать чистый текст. В то же время, имея название файла и номер страницы, можно восстановить оригинальную разметку из исходного ks-файла.
   
Python входит в стандартную конфигурацию многих ОС (например, Mac OS X, различные версии Linux и *BSD), '''кроме ОС от Microsoft'''.
+
Python входит в стандартную конфигурацию многих ОС (например, Mac OS X, различные версии Linux и *BSD), '''кроме ОС от Microsoft'''. '''Для использования Python под Windows скачайте и установите дистрибутив Python 2.x с [http://www.python.org/ официального сайта].'''
   
  +
Сохраните нижеприведенный код в текстовый файл (*.txt), переименуйте его в *.py и поместите в каталог с файлами, подлежащими обработке. Если у вас установлен Python, *.py-файлы можно запускать так же, как и другие программы.
'''Для использования Python под Windows скачайте и установите дистрибутив Python 2.x с [http://www.python.org/ официального сайта].'''
 
  +
<!--HTML-тэги PRE к скрипту отношения не имеют, так же, как и этот комментарий--><pre>
  +
import os, codecs
   
  +
def debrack(line, num):
Если в Windows для программ, не поддерживающих Unicode, не установлена кодировка Shift-JIS, скрипт с именами файлов на японском работать не будет. Поэтому *.ks-файлы нужно переименовать, исключив из названий все не-ASCII символы (должна остаться только латиница и/или цифры), иначе потребуется запускать скрипт через Microsoft Applocale. В последнем случае откройте консоль с помощью Applocale (укажите в Applocale для запуска файл '''%windir%\system32\cmd.exe''' - если используется Windows XP), перейдите в консоли в каталог с файлами, подлежащими обработке (например, с помощью команды '''cd C:\FSN'''), и запустите заранее созданный и помещенный туда же *.py-файл (например, командой '''gettext.py'''), содержащий следующий текст:
 
<pre>import os
 
 
def debrack(line):
 
 
linemark = line.find('[line')
 
linemark = line.find('[line')
 
if linemark+1:
 
if linemark+1:
line = line[:linemark]+'-----'+line[linemark+7:]
+
linelen = line[linemark+5:line.find(']', linemark)]
  +
line = line.replace('[line'+linelen+']', int(linelen)*'-')
 
start = line.find('[')
 
start = line.find('[')
end = line.find(']')
 
 
if start == -1: return line
 
if start == -1: return line
  +
nextstart = line.find('[', start+1)
  +
if nextstart == -1: nextstart = start
  +
end = line.find(']')
  +
if nextstart and nextstart < end: start = nextstart
 
if start < end: return line[:start]+line[end+1:]
 
if start < end: return line[:start]+line[end+1:]
  +
print 'Line '+str(num)+':'
  +
print line
  +
print 'start:', start, 'next:', nextstart, 'end:', end
 
return ''
 
return ''
   
 
files = []
 
files = []
  +
linenum = 0
for file in os.listdir(os.getcwd()):
 
  +
for file in os.listdir(os.getcwdu()):
 
if file.endswith('.ks'): files.append(file)
 
if file.endswith('.ks'): files.append(file)
 
if len(files) == 0:
 
if len(files) == 0:
print 'No *.ks file(-s) to decode in current directory!'
+
print 'No files to decode!'
 
exit()
 
exit()
 
for file in files:
 
for file in files:
print file,
+
print 'Script', files.index(file)+1, '/', len(files),
raw = open(file, 'rb')
+
raw = codecs.open(file, 'rb', 'UTF-16')
res = open(file.replace('.ks', '.txt'), 'wb')
+
res = codecs.open(file.replace('.ks', '.txt'), 'wb', 'UTF-16')
  +
res.write(u'<!--'+file+'-->\r\n')
 
for line in raw:
 
for line in raw:
  +
linenum += 1
if line.find('\x00[\x00w\x00r\x00a\x00p\x00 \x00t\x00e\x00x\x00t\x00=\x00"\x00"\x00]') >= 0:
 
line = line.replace('\x00', '')
+
if line.find('[wrap text=""]') >= 0:
 
line = line.replace('[l]', '\r\n')
 
line = line.replace('[l]', '\r\n')
templine = debrack(line)
+
templine = debrack(line, linenum)
 
for i in range (1,100):
 
for i in range (1,100):
newline = debrack(templine)
+
newline = debrack(templine, linenum)
 
if newline[2:4] == '""': break
 
if newline[2:4] == '""': break
 
if newline == templine:
 
if newline == templine:
res.write(newline.replace('\x00', '')[2:])
+
res.write(newline.lstrip())
 
break
 
break
 
else:
 
else:
 
templine = newline
 
templine = newline
if line.find('*page')+1: res.write('\r\n')
+
if line.find('*page')+1: res.write('<!--'+line[line.find('*'):line.find('|')+1]+'-->\r\n')
 
raw.close()
 
raw.close()
  +
linenum = 0
 
res.close()
 
res.close()
print '-> '+file.replace('.ks', '.txt')</pre>
+
print 'saved.'
  +
</pre>

Latest revision as of 13:47, 1 September 2009

Введение[edit]

Расшифрованные *.ks-файлы содержат, наряду с собственно текстом, служебную информацию (например, для корректной разбивки фразы на слова при переносе). Для того чтобы убрать эту информацию из файла и получить текст в "читабельном" виде, можно воспользоваться следующими вариантами:

  • макрос для MS Word 2003 (для обработки текста в отдельном документе Word)
  • скрипт на Python (для обработки всех *.ks-файлов в отдельном каталоге) обновлен 2009-09-01

Макрос для MS Word 2003[edit]

Для использования макроса необходимо вставить его в документ, сохранить изменения и запустить его на выполнение. Чтобы вставить макрос, нажмите Alt+F11, вставьте код (Ctrl+C, Ctrl+V) и сохраните документ (Ctrl+S). Для запуска воспользуйтесь меню Сервис - Макрос.

После работы макроса, возможно, в документе останутся некоторые нежелательные фрагменты, но значительных неудобств при работе они не доставлять не будут. Пожелания и предложения принимаются на соответствующей странице обсуждения.

Sub FSN_CleanUp()
'
' macro for MS Word 2003
' created at 11.05.2008 by DMC
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\*page0*texton"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "\[wrap text=*\]"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "\[line*\]"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "[l][r]"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\*page*|"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "@pgnl"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\@textoff*texton^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "@pg"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\@textoff*return^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\@*^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = """"""
        .Replacement.Text = """..."""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
End Sub

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

Также можно воспользоваться скриптом, сохраняющим отображаемый текст и минимум разметки (название файла и номера страниц) из всех *.ks-файлов в каталоге, куда он помещен. Полученный текст сохраняется в соответствующие *.txt-файлы в том же каталоге. Поскольку разметка сделана в виде комментариев, движок вики показывает их только в режиме редактирования. Это позволяет "скопипастить" готовый *.txt в вики, сохранить/"предпросмотреть" его, и читать чистый текст. В то же время, имея название файла и номер страницы, можно восстановить оригинальную разметку из исходного ks-файла.

Python входит в стандартную конфигурацию многих ОС (например, Mac OS X, различные версии Linux и *BSD), кроме ОС от Microsoft. Для использования Python под Windows скачайте и установите дистрибутив Python 2.x с официального сайта.

Сохраните нижеприведенный код в текстовый файл (*.txt), переименуйте его в *.py и поместите в каталог с файлами, подлежащими обработке. Если у вас установлен Python, *.py-файлы можно запускать так же, как и другие программы.

import os, codecs

def debrack(line, num):
 linemark = line.find('[line')
 if linemark+1:
  linelen = line[linemark+5:line.find(']', linemark)]
  line = line.replace('[line'+linelen+']', int(linelen)*'-')
 start = line.find('[')
 if start == -1: return line
 nextstart = line.find('[', start+1)
 if nextstart == -1: nextstart = start
 end = line.find(']')
 if nextstart and nextstart < end: start = nextstart
 if start < end: return line[:start]+line[end+1:]
 print 'Line '+str(num)+':'
 print line
 print 'start:', start, 'next:', nextstart, 'end:', end
 return ''

files = []
linenum = 0
for file in os.listdir(os.getcwdu()):
 if file.endswith('.ks'): files.append(file)
if len(files) == 0:
 print 'No files to decode!'
 exit()
for file in files:
 print 'Script', files.index(file)+1, '/', len(files),
 raw = codecs.open(file, 'rb', 'UTF-16')
 res = codecs.open(file.replace('.ks', '.txt'), 'wb', 'UTF-16')
 res.write(u'<!--'+file+'-->\r\n')
 for line in raw:
  linenum += 1
  if line.find('[wrap text=""]') >= 0:
   line = line.replace('[l]', '\r\n')
   templine = debrack(line, linenum)
   for i in range (1,100):
    newline = debrack(templine, linenum)
    if newline[2:4] == '""': break
    if newline == templine:
     res.write(newline.lstrip())
     break
    else:
     templine = newline
  if line.find('*page')+1: res.write('<!--'+line[line.find('*'):line.find('|')+1]+'-->\r\n')
 raw.close()
 linenum = 0
 res.close()
 print 'saved.'