Difference between revisions of "Fate/stay night:Clean .KS files"

From Baka-Tsuki
Jump to navigation Jump to search
(Split up in two parts)
 
(10 intermediate revisions by 2 users not shown)
Line 1: Line 1:
  +
== Introduction ==
This program allow you to clean a .ks file from kirikiri script (@...) and word wrapping ([wrap text="..."]).
 
  +
Decrypted *.ks-files contain not just decrypted text, but various service info as well (word wrapping tags, for example) that hinders translation process. To remove this service info and get text-only file, one can use:
For the moment you can only clean file one by one and save it manually, but I will make an upgrade to clean directory recursivly (so, the whole game in one click ^^)
 
   
  +
*MS Word 2003 macro (to edit one given script file within Word). Requires MS Word 2003 or above.
I wrote this program in .Net 3.5 (not SP1), so you need the .Net framework up-to-date on your PC.
 
  +
*Python script (for batch processing of all *.ks-files in a given directory). Requires Python 2.x and (sometimes) MS Applocale.
If you want, you can access to the source code with a simple .Net decompiler, I don't have protected this program.
 
   
You don't need to install this program, it is just a .exe, it will try to create a .config file to save your settings (last directory used...) but it is not a very important file ^^
 
   
  +
== MS Word 2003 Macro ==
  +
Requires MS Word 2003 or newer.<br>
  +
To use the following macro, you have to insert it into your Word document, save changes and run it. It will remove most frequent tags from your script (you can tell by looking).
  +
Press '''Alt+F11''' to insert a macro in your document, copy and paste the following code ('''Ctrl+C, Ctrl+V''') and save changes ('''Ctrl+S'''). Then run a macro via menu, usually '''Service - Macro'''. <!-- Translation may be wrong, please fix it in this case, if you have English version of MS Word-->
  +
<pre>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
  +
</pre>
  +
Original version is [http://www.baka-tsuki.org/project/index.php?title=%D0%A1%D1%83%D0%B4%D1%8C%D0%B1%D0%B0/%D0%9D%D0%BE%D1%87%D1%8C_%D1%81%D1%85%D0%B2%D0%B0%D1%82%D0%BA%D0%B8:%D0%A7%D0%B8%D1%81%D1%82%D0%BA%D0%B0_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2 here] (Russian).
   
  +
== Python Batch Script ==
For clean a file, open it (with File->Open, or just drop your file on the white zone) then go in Edit->Clean a file.
 
  +
Requires Python 2.x ([http://www.python.org/download/ download]). MS Applocale ([http://www.microsoft.com/globaldev/tools/apploc.mspx download], [http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=8c4e8e0d-45d1-4d9b-b7c0-8430c1ac89ab&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f6%2f8%2f568a8caf-29c4-43ec-a10f-97730f26977e%2fapploc.msi DDL] or [http://www.google.com/search?q=Applocale+download Google]) is required only if your .ks-files have Japanese characters in filenames.<br>
  +
The following script exports only text from all .ks-files in the directory it's run from. Text is saved in .txt-files that are created the same directory, one .txt per each .ks-file. Save the following code as text (*.txt) file, rename it into Python script (*.py) file and copy/move script file to a directory you have extracted .ks-files in. If you have Python installed, *.py-files can be run as other programs (e.g. by single or double-click).
   
  +
Python is bundled with many operating systems (Mac OS X, *nix and *BSD), <u>but not with OS from Microsoft</u>. To be able to use Python in Windows, you have to download and install Python 2.x (script isn't tested with Python 3.0 and above).
Then go save your file (File->Save) where you want, or just copy the text, on a web page for example.
 
   
  +
If your Windows OS doesn't use Japanese local settings for programs that don't support Unicode, script won't work on .ks-files with Japanese characters in filenames. Hence you either should rename your *.ks-files in order for them to have only ASCII symbols in filenames (latin alphabet and/or digits) or run script under Microsoft Applocale. In latter case open command line console via Applocale (start Applocale and set it to run '''%windir%\system32\cmd.exe''' under Windows XP or 2003), change directory to the location of your *.ks-files and *.py-file (e.g. '''cd "C:\FSN Files\Scripts"'''), and run Python script (e.g by entering '''gettext.py''' in command line). Script file must contain the following (make sure you have indentation intact, Python is strict about this!):
For clean an other file, close your file (File->Close), and open an other! [ Yes I will simplify that in next version ^^]
 
   
  +
<pre>import os
   
  +
def debrack(line):
If you have any question, request or bug, please [http://www.baka-tsuki.net/forums/ucp.php?i=pm&mode=compose&action=quotepost&p=48568| PM me on the baka-tsuki forum].
 
  +
linemark = line.find('[line')
  +
if linemark+1:
  +
line = line[:linemark]+'-----'+line[linemark+7:]
  +
start = line.find('[')
  +
end = line.find(']')
  +
if start == -1: return line
  +
if start < end: return line[:start]+line[end+1:]
  +
return ''
   
  +
files = []
There you have :
 
  +
for file in os.listdir(os.getcwd()):
 
  +
if file.endswith('.ks'): files.append(file)
--[[User:Bejarid|Bejarid]] 19:39, 22 February 2009 (UTC)
 
  +
if len(files) == 0:
  +
print 'No *.ks file(-s) to decode in current directory!'
  +
exit()
  +
for file in files:
  +
print file,
  +
raw = open(file, 'rb')
  +
res = open(file.replace('.ks', '.txt'), 'wb')
  +
for line in raw:
  +
if line.find('\x00[\x00w\x00r\x00a\x00p\x00 \x00t\x00e\x00x\x00t\x00=\x00"\x00"\x00]') >= 0:
  +
line = line.replace('\x00', '')
  +
line = line.replace('[l]', '\r\n')
  +
templine = debrack(line)
  +
for i in range (1,100):
  +
newline = debrack(templine)
  +
if newline[2:4] == '""': break
  +
if newline == templine:
  +
res.write(newline[2:])
  +
break
  +
else:
  +
templine = newline
  +
if line.find('*page')+1: res.write('\r\n')
  +
raw.close()
  +
res.close()
  +
print '-> '+file.replace('.ks', '.txt')</pre>
  +
Original version is [http://www.baka-tsuki.org/project/index.php?title=%D0%A1%D1%83%D0%B4%D1%8C%D0%B1%D0%B0/%D0%9D%D0%BE%D1%87%D1%8C_%D1%81%D1%85%D0%B2%D0%B0%D1%82%D0%BA%D0%B8:%D0%A7%D0%B8%D1%81%D1%82%D0%BA%D0%B0_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2 here] (Russian). Use [http://www.baka-tsuki.org/project/index.php?title=Talk:Fate/stay_night:Clean_.KS_files&action=edit discussion page] for comments or PM [http://www.baka-tsuki.net/forums/ucp.php?i=pm&mode=compose&u=1335 Const2k] on B-T forum.

Latest revision as of 00:30, 23 March 2009

Introduction[edit]

Decrypted *.ks-files contain not just decrypted text, but various service info as well (word wrapping tags, for example) that hinders translation process. To remove this service info and get text-only file, one can use:

  • MS Word 2003 macro (to edit one given script file within Word). Requires MS Word 2003 or above.
  • Python script (for batch processing of all *.ks-files in a given directory). Requires Python 2.x and (sometimes) MS Applocale.


MS Word 2003 Macro[edit]

Requires MS Word 2003 or newer.
To use the following macro, you have to insert it into your Word document, save changes and run it. It will remove most frequent tags from your script (you can tell by looking). Press Alt+F11 to insert a macro in your document, copy and paste the following code (Ctrl+C, Ctrl+V) and save changes (Ctrl+S). Then run a macro via menu, usually Service - Macro.

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

Original version is here (Russian).

Python Batch Script[edit]

Requires Python 2.x (download). MS Applocale (download, DDL or Google) is required only if your .ks-files have Japanese characters in filenames.
The following script exports only text from all .ks-files in the directory it's run from. Text is saved in .txt-files that are created the same directory, one .txt per each .ks-file. Save the following code as text (*.txt) file, rename it into Python script (*.py) file and copy/move script file to a directory you have extracted .ks-files in. If you have Python installed, *.py-files can be run as other programs (e.g. by single or double-click).

Python is bundled with many operating systems (Mac OS X, *nix and *BSD), but not with OS from Microsoft. To be able to use Python in Windows, you have to download and install Python 2.x (script isn't tested with Python 3.0 and above).

If your Windows OS doesn't use Japanese local settings for programs that don't support Unicode, script won't work on .ks-files with Japanese characters in filenames. Hence you either should rename your *.ks-files in order for them to have only ASCII symbols in filenames (latin alphabet and/or digits) or run script under Microsoft Applocale. In latter case open command line console via Applocale (start Applocale and set it to run %windir%\system32\cmd.exe under Windows XP or 2003), change directory to the location of your *.ks-files and *.py-file (e.g. cd "C:\FSN Files\Scripts"), and run Python script (e.g by entering gettext.py in command line). Script file must contain the following (make sure you have indentation intact, Python is strict about this!):

import os

def debrack(line):
 linemark = line.find('[line')
 if linemark+1:
  line = line[:linemark]+'-----'+line[linemark+7:]
 start = line.find('[')
 end = line.find(']')
 if start == -1: return line
 if start < end: return line[:start]+line[end+1:]
 return ''

files = []
for file in os.listdir(os.getcwd()):
 if file.endswith('.ks'): files.append(file)
if len(files) == 0:
 print 'No *.ks file(-s) to decode in current directory!'
 exit()
for file in files:
 print file,
 raw = open(file, 'rb')
 res = open(file.replace('.ks', '.txt'), 'wb')
 for line in raw:
  if line.find('\x00[\x00w\x00r\x00a\x00p\x00 \x00t\x00e\x00x\x00t\x00=\x00"\x00"\x00]') >= 0:
   line = line.replace('\x00', '')
   line = line.replace('[l]', '\r\n')
   templine = debrack(line)
   for i in range (1,100):
    newline = debrack(templine)
    if newline[2:4] == '""': break
    if newline == templine:
     res.write(newline[2:])
     break
    else:
     templine = newline
  if line.find('*page')+1: res.write('\r\n')
 raw.close()
 res.close()
 print '-> '+file.replace('.ks', '.txt')

Original version is here (Russian). Use discussion page for comments or PM Const2k on B-T forum.