Difference between revisions of "Судьба/Ночь схватки:Чистка скриптов"
(rephrased comments and added Python script / перефразировал комментарии, добавил скрипт на Python) |
m (улучшил вывод в консоль / better console output) |
||
(6 intermediate revisions by 2 users 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 184: | Line 184: | ||
With Selection.Find |
With Selection.Find |
||
.Text = """""" |
.Text = """""" |
||
− | .Replacement.Text = ""..."" |
+ | .Replacement.Text = """...""" |
.Forward = True |
.Forward = True |
||
.Wrap = wdFindContinue |
.Wrap = wdFindContinue |
||
Line 195: | Line 195: | ||
.MatchWildcards = False |
.MatchWildcards = False |
||
.MatchFuzzy = False |
.MatchFuzzy = False |
||
+ | End With |
||
Selection.Find.Execute Replace:=wdReplaceAll |
Selection.Find.Execute Replace:=wdReplaceAll |
||
Line 201: | Line 202: | ||
==Скрипт на Python== |
==Скрипт на Python== |
||
− | Также можно воспользоваться скриптом, сохраняющим |
+ | Также можно воспользоваться скриптом, сохраняющим отображаемый текст и минимум разметки (название файла и номера страниц) из всех *.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'''), содержащий следующий текст: |
||
+ | linemark = line.find('[line') |
||
− | <pre>import os |
||
+ | if linemark+1: |
||
− | |||
+ | linelen = line[linemark+5:line.find(']', linemark)] |
||
− | def debrack(line): |
||
+ | 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 |
+ | 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: |
||
+ | if line.find('[wrap text=""]') >= 0: |
||
− | templine = debrack(line) |
||
+ | line = line.replace('[l]', '\r\n') |
||
+ | 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 == templine: |
if newline == templine: |
||
− | res.write(newline. |
+ | res.write(newline.lstrip()) |
break |
break |
||
else: |
else: |
||
templine = newline |
templine = newline |
||
+ | 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 ' |
+ | 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.'