Skip to content

Commit 94c6c1e

Browse files
committed
#112 Перечисление КодировкаТекста
1 parent e2f8079 commit 94c6c1e

File tree

5 files changed

+152
-9
lines changed

5 files changed

+152
-9
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
using ScriptEngine.Machine;
2+
using ScriptEngine.Machine.Contexts;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
8+
namespace ScriptEngine.HostedScript.Library
9+
{
10+
[SystemEnum("КодировкаТекста", "TextEncoding")]
11+
public class TextEncodingEnum : EnumerationContext
12+
{
13+
private const string ENCODING_ANSI = "ANSI";
14+
private const string ENCODING_OEM = "OEM";
15+
private const string ENCODING_UTF16 = "UTF16";
16+
private const string ENCODING_UTF8 = "UTF8";
17+
private const string ENCODING_SYSTEM = "Системная";
18+
19+
private TextEncodingEnum(TypeDescriptor typeRepresentation, TypeDescriptor valuesType)
20+
: base(typeRepresentation, valuesType)
21+
{
22+
}
23+
24+
[EnumValue(ENCODING_ANSI)]
25+
public EnumerationValue Ansi
26+
{
27+
get
28+
{
29+
return this[ENCODING_ANSI];
30+
}
31+
}
32+
33+
[EnumValue(ENCODING_OEM)]
34+
public EnumerationValue Oem
35+
{
36+
get
37+
{
38+
return this[ENCODING_OEM];
39+
}
40+
}
41+
42+
[EnumValue(ENCODING_UTF16)]
43+
public EnumerationValue Utf16
44+
{
45+
get
46+
{
47+
return this[ENCODING_UTF16];
48+
}
49+
}
50+
51+
[EnumValue(ENCODING_UTF8)]
52+
public EnumerationValue Utf8
53+
{
54+
get
55+
{
56+
return this[ENCODING_UTF8];
57+
}
58+
}
59+
60+
[EnumValue(ENCODING_SYSTEM)]
61+
public EnumerationValue System
62+
{
63+
get
64+
{
65+
return this[ENCODING_SYSTEM];
66+
}
67+
}
68+
69+
public static TextEncodingEnum CreateInstance()
70+
{
71+
TextEncodingEnum instance;
72+
73+
TypeDescriptor enumType;
74+
TypeDescriptor enumValType;
75+
76+
EnumContextHelper.RegisterEnumType<TextEncodingEnum>(out enumType, out enumValType);
77+
78+
instance = new TextEncodingEnum(enumType, enumValType);
79+
80+
EnumContextHelper.RegisterValues<TextEncodingEnum>(instance);
81+
82+
return instance;
83+
}
84+
85+
public static Encoding GetEncoding(IValue encoding)
86+
{
87+
if (encoding.DataType == DataType.String)
88+
return Encoding.GetEncoding(encoding.AsString());
89+
else
90+
{
91+
if (encoding.DataType != DataType.GenericValue)
92+
throw RuntimeException.InvalidArgumentType();
93+
94+
var encValue = encoding.GetRawValue() as SelfAwareEnumValue<TextEncodingEnum>;
95+
if (encValue == null)
96+
throw RuntimeException.InvalidArgumentType();
97+
98+
var encodingEnum = GlobalsManager.GetEnum<TextEncodingEnum>();
99+
100+
Encoding enc;
101+
if (encValue == encodingEnum.Ansi)
102+
enc = Encoding.GetEncoding(1251);
103+
else if (encValue == encodingEnum.Oem)
104+
enc = Encoding.GetEncoding(866);
105+
else if (encValue == encodingEnum.Utf16)
106+
enc = new UnicodeEncoding(false, true);
107+
else if (encValue == encodingEnum.Utf8)
108+
enc = new UTF8Encoding(true);
109+
else if (encValue == encodingEnum.System)
110+
enc = Encoding.Default;
111+
else
112+
throw RuntimeException.InvalidArgumentValue();
113+
114+
return enc;
115+
}
116+
}
117+
118+
}
119+
}

src/ScriptEngine.HostedScript/Library/TextReadImpl.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ class TextReadImpl : AutoContext<TextReadImpl>, IDisposable
1212
StreamReader _reader;
1313

1414
[ContextMethod("Открыть", "Open")]
15-
public void Open(string path, string encoding = null)
15+
public void Open(string path, IValue encoding = null)
1616
{
1717
if (encoding == null)
1818
{
1919
_reader = Environment.FileOpener.OpenReader(path);
2020
}
2121
else
2222
{
23-
var enc = Encoding.GetEncoding(encoding);
23+
var enc = TextEncodingEnum.GetEncoding(encoding);
2424
_reader = Environment.FileOpener.OpenReader(path, enc);
2525
}
2626
}
@@ -63,7 +63,7 @@ private void RequireOpen()
6363
public static IRuntimeContextInstance Constructor(IValue path, IValue encoding)
6464
{
6565
var reader = new TextReadImpl();
66-
reader.Open(path.AsString(), encoding.AsString());
66+
reader.Open(path.AsString(), encoding);
6767
return reader;
6868
}
6969

src/ScriptEngine.HostedScript/Library/TextWriteImpl.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ public TextWriteImpl()
1616

1717
}
1818

19-
public TextWriteImpl(string path, string encoding)
19+
public TextWriteImpl(string path, IValue encoding)
2020
{
2121
Open(path, encoding);
2222
}
2323

24-
public TextWriteImpl(string path, string encoding, bool append)
24+
public TextWriteImpl(string path, IValue encoding, bool append)
2525
{
2626
Open(path, encoding, append);
2727
}
@@ -33,7 +33,7 @@ public TextWriteImpl(string path, string encoding, bool append)
3333
/// <param name="encoding">Кодировка (необязательный). По умолчанию используется utf-8</param>
3434
/// <param name="append">Признак добавления в конец файла. (необязательный)</param>
3535
[ContextMethod("Открыть", "Open")]
36-
public void Open(string path, string encoding = null, bool append = false)
36+
public void Open(string path, IValue encoding = null, bool append = false)
3737
{
3838
Encoding enc;
3939
if (encoding == null)
@@ -42,7 +42,7 @@ public void Open(string path, string encoding = null, bool append = false)
4242
}
4343
else
4444
{
45-
enc = Encoding.GetEncoding(encoding);
45+
enc = TextEncodingEnum.GetEncoding(encoding);
4646
if (enc.WebName == "utf-8" && append == true)
4747
enc = new UTF8Encoding(false);
4848
}
@@ -88,7 +88,7 @@ public void Dispose()
8888
[ScriptConstructor(Name = "")]
8989
public static IRuntimeContextInstance Constructor(IValue path, IValue encoding)
9090
{
91-
return new TextWriteImpl(path.AsString(), encoding.AsString());
91+
return new TextWriteImpl(path.AsString(), encoding);
9292
}
9393

9494
/// <summary>
@@ -100,7 +100,7 @@ public static IRuntimeContextInstance Constructor(IValue path, IValue encoding)
100100
[ScriptConstructor(Name = "По имени файла и кодировке")]
101101
public static IRuntimeContextInstance Constructor(IValue path, IValue encoding, IValue append)
102102
{
103-
return new TextWriteImpl(path.AsString(), encoding.AsString(), append.AsBoolean());
103+
return new TextWriteImpl(path.AsString(), encoding, append.AsBoolean());
104104
}
105105

106106
/// <summary>

src/ScriptEngine.HostedScript/ScriptEngine.HostedScript.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
<Compile Include="Library\Reflector.cs" />
8989
<Compile Include="Library\SymbolsEnum.cs" />
9090
<Compile Include="Library\SystemEnvironmentContext.cs" />
91+
<Compile Include="Library\TextEncodingEnum.cs" />
9192
<Compile Include="Library\TextReadImpl.cs" />
9293
<Compile Include="Library\TextWriteImpl.cs" />
9394
<Compile Include="Library\Xml\XmlGlobalFunctions.cs" />

tests/text-write.os

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
ВсеТесты = Новый Массив;
88

99
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOM");
10+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСПеречислениемКодировкаТекста");
1011

1112
Возврат ВсеТесты;
1213

@@ -33,3 +34,25 @@
3334
УдалитьФайлы(Путь);
3435

3536
КонецПроцедуры
37+
38+
Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСПеречислениемКодировкаТекста() Экспорт
39+
40+
Путь = ПолучитьИмяВременногоФайла("txt");
41+
ЗТ = Новый ЗаписьТекста(Путь, КодировкаТекста.ANSI);
42+
ЗТ.Закрыть();
43+
ЗТ = Новый ЗаписьТекста(Путь,КодировкаТекста.UTF8,Истина);
44+
ЗТ.Записать("Привет");
45+
ЗТ.Закрыть();
46+
47+
Файл = Новый Файл(Путь);
48+
49+
Попытка
50+
юТест.ПроверитьРавенство(12, Файл.Размер());
51+
Исключение
52+
УдалитьФайлы(Путь);
53+
ВызватьИсключение;
54+
КонецПопытки;
55+
56+
УдалитьФайлы(Путь);
57+
58+
КонецПроцедуры

0 commit comments

Comments
 (0)