hellbound/Assets/Sources/I2/Localization/Scripts/LocalizationReader.cs

243 lines
6.0 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
namespace I2.Loc
{
public class LocalizationReader
{
#region Dictionary Assets
public static Dictionary<string,string> ReadTextAsset( TextAsset asset )
{
string Text = Encoding.UTF8.GetString (asset.bytes, 0, asset.bytes.Length);
Text = Text.Replace("\r\n", "\n");
Text = Text.Replace("\r", "\n");
StringReader reader = new StringReader(Text);
string s;
Dictionary<string, string> Dict = new Dictionary<string, string>(StringComparer.Ordinal);
while ( (s=reader.ReadLine()) != null )
{
string Key, Value, Category, TermType, Comment;
if (!TextAsset_ReadLine(s, out Key, out Value, out Category, out Comment, out TermType))
continue;
if (!string.IsNullOrEmpty(Key) && !string.IsNullOrEmpty(Value))
Dict[Key]=Value;
}
return Dict;
}
public static bool TextAsset_ReadLine( string line, out string key, out string value, out string category, out string comment, out string termType )
{
key = string.Empty;
category= string.Empty;
comment = string.Empty;
termType= string.Empty;
value = string.Empty;
//--[ Comment ]-----------------------
int iComment = line.LastIndexOf("//", StringComparison.Ordinal);
if (iComment>=0)
{
comment = line.Substring(iComment+2).Trim();
comment = DecodeString(comment);
line = line.Substring(0, iComment);
}
//--[ Key ]-----------------------------
int iKeyEnd = line.IndexOf("=", StringComparison.Ordinal);
if (iKeyEnd<0)
{
return false;
}
key = line.Substring(0, iKeyEnd).Trim();
value = line.Substring(iKeyEnd+1).Trim();
value = value.Replace ("\r\n", "\n").Replace ("\n", "\\n");
value = DecodeString(value);
//--[ Type ]---------
if (key.Length>2 && key[0]=='[')
{
int iTypeEnd = key.IndexOf(']');
if (iTypeEnd>=0)
{
termType = key.Substring(1, iTypeEnd-1);
key = key.Substring(iTypeEnd+1);
}
}
ValidateFullTerm( ref key );
return true;
}
#endregion
#region CSV
public static string ReadCSVfile( string Path, Encoding encoding )
{
string Text = string.Empty;
#if (UNITY_WP8 || UNITY_METRO) && !UNITY_EDITOR
byte[] buffer = UnityEngine.Windows.File.ReadAllBytes (Path);
Text = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
#else
/*using (System.IO.StreamReader reader = System.IO.File.OpenText(Path))
{
Text = reader.ReadToEnd();
}*/
using (var reader = new StreamReader(Path, encoding ))
Text = reader.ReadToEnd();
#endif
Text = Text.Replace("\r\n", "\n");
Text = Text.Replace("\r", "\n");
return Text;
}
public static List<string[]> ReadCSV( string Text, char Separator=',' )
{
int iStart = 0;
List<string[]> CSV = new List<string[]>();
while (iStart < Text.Length)
{
string[] list = ParseCSVline (Text, ref iStart, Separator);
if (list==null) break;
CSV.Add(list);
}
return CSV;
}
static string[] ParseCSVline( string Line, ref int iStart, char Separator )
{
List<string> list = new List<string>();
//Line = "puig,\"placeres,\"\"cab\nr\nera\"\"algo\"\npuig";//\"Frank\npuig\nplaceres\",aaa,frank\nplaceres";
int TextLength = Line.Length;
int iWordStart = iStart;
bool InsideQuote = false;
while (iStart < TextLength)
{
char c = Line[iStart];
if (InsideQuote)
{
if (c=='\"') //--[ Look for Quote End ]------------
{
if (iStart+1 >= TextLength || Line[iStart+1] != '\"') //-- Single Quote: Quotation Ends
{
InsideQuote = false;
}
else
if (iStart+2 < TextLength && Line[iStart+2]=='\"') //-- Tripple Quotes: Quotation ends
{
InsideQuote = false;
iStart+=2;
}
else
iStart++; // Skip Double Quotes
}
}
else //-----[ Separators ]----------------------
if (c=='\n' || c==Separator)
{
AddCSVtoken(ref list, ref Line, iStart, ref iWordStart);
if (c=='\n') // Stop the row on line breaks
{
iStart++;
break;
}
}
else //--------[ Start Quote ]--------------------
if (c=='\"')
InsideQuote = true;
iStart++;
}
if (iStart>iWordStart)
AddCSVtoken(ref list, ref Line, iStart, ref iWordStart);
return list.ToArray();
}
static void AddCSVtoken( ref List<string> list, ref string Line, int iEnd, ref int iWordStart)
{
string Text = Line.Substring(iWordStart, iEnd-iWordStart);
iWordStart = iEnd+1;
Text = Text.Replace("\"\"", "\"" );
if (Text.Length>1 && Text[0]=='\"' && Text[Text.Length-1]=='\"')
Text = Text.Substring(1, Text.Length-2 );
list.Add( Text);
}
#endregion
#region I2CSV
public static List<string[]> ReadI2CSV( string Text )
{
string[] ColumnSeparator = {"[*]"};
string[] RowSeparator = {"[ln]"};
List<string[]> CSV = new List<string[]>();
foreach (var line in Text.Split (RowSeparator, StringSplitOptions.None))
CSV.Add (line.Split (ColumnSeparator, StringSplitOptions.None));
return CSV;
}
#endregion
#region Misc
public static void ValidateFullTerm( ref string Term )
{
Term = Term.Replace('\\', '/');
int First = Term.IndexOf('/');
if (First<0)
return;
int second;
while ( (second=Term.LastIndexOf('/')) != First )
Term = Term.Remove( second,1);
}
// this function encodes \r\n and \n into \\n
public static string EncodeString( string str )
{
if (string.IsNullOrEmpty(str))
return string.Empty;
return str.Replace("\r\n", "<\\n>")
.Replace("\r", "<\\n>")
.Replace("\n", "<\\n>");
}
public static string DecodeString( string str )
{
if (string.IsNullOrEmpty(str))
return string.Empty;
return str.Replace("<\\n>", "\r\n");
}
#endregion
}
}