Судьба/Ночь схватки:Чистка скриптов: Difference between revisions
m "\[wrap text=*\]" |
m улучшил вывод в консоль / better console output |
||
| (7 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
при | ==Введение== | ||
Расшифрованные *.ks-файлы содержат, наряду с собственно текстом, служебную информацию (например, для корректной разбивки фразы на слова при переносе). Для того чтобы убрать эту информацию из файла и получить текст в "читабельном" виде, можно воспользоваться следующими вариантами: | |||
*макрос для MS Word 2003 (для обработки текста в отдельном документе Word) | |||
*скрипт на Python (для обработки всех *.ks-файлов в отдельном каталоге) <font color="red">обновлен 2009-09-01</font> | |||
==Макрос для MS Word 2003== | |||
Для использования макроса необходимо вставить его в документ, сохранить изменения и запустить его на выполнение. Чтобы вставить макрос, нажмите '''Alt+F11''', вставьте код ('''Ctrl+C, Ctrl+V''') и сохраните документ ('''Ctrl+S'''). Для запуска воспользуйтесь меню '''Сервис - Макрос'''. | |||
После работы макроса, возможно, в документе останутся некоторые нежелательные фрагменты, но значительных неудобств при работе они не доставлять не будут. Пожелания и предложения принимаются [[Talk:Судьба/Ночь схватки:Чистка скриптов|на соответствующей странице обсуждения]]. | |||
<pre>Sub FSN_CleanUp() | <pre>Sub FSN_CleanUp() | ||
' | ' | ||
| Line 175: | Line 184: | ||
With Selection.Find | With Selection.Find | ||
.Text = """""" | .Text = """""" | ||
.Replacement.Text = ""..."" | .Replacement.Text = """...""" | ||
.Forward = True | .Forward = True | ||
.Wrap = wdFindContinue | .Wrap = wdFindContinue | ||
| Line 186: | Line 195: | ||
.MatchWildcards = False | .MatchWildcards = False | ||
.MatchFuzzy = False | .MatchFuzzy = False | ||
End With | |||
Selection.Find.Execute Replace:=wdReplaceAll | Selection.Find.Execute Replace:=wdReplaceAll | ||
End Sub | End Sub | ||
</pre> | </pre> | ||
==Скрипт на Python== | |||
Также можно воспользоваться скриптом, сохраняющим отображаемый текст и минимум разметки (название файла и номера страниц) из всех *.ks-файлов в каталоге, куда он помещен. Полученный текст сохраняется в соответствующие *.txt-файлы в том же каталоге. Поскольку разметка сделана в виде комментариев, движок вики показывает их только в режиме редактирования. Это позволяет "скопипастить" готовый *.txt в вики, сохранить/"предпросмотреть" его, и читать чистый текст. В то же время, имея название файла и номер страницы, можно восстановить оригинальную разметку из исходного ks-файла. | |||
Python входит в стандартную конфигурацию многих ОС (например, Mac OS X, различные версии Linux и *BSD), '''кроме ОС от Microsoft'''. '''Для использования Python под Windows скачайте и установите дистрибутив Python 2.x с [http://www.python.org/ официального сайта].''' | |||
Сохраните нижеприведенный код в текстовый файл (*.txt), переименуйте его в *.py и поместите в каталог с файлами, подлежащими обработке. Если у вас установлен Python, *.py-файлы можно запускать так же, как и другие программы. | |||
<!--HTML-тэги PRE к скрипту отношения не имеют, так же, как и этот комментарий--><pre> | |||
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.' | |||
</pre> | |||
Latest revision as of 11: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.'