├── .gitignore
├── .travis.yml
├── LICENSE
├── NUnitTests
├── EngineHelpWrapper.cs
├── MainTestClass.cs
├── NUnitTests.csproj
├── Tests
│ ├── external.os
│ └── testrunner.os
└── packages.config
├── README.md
├── TestApp
├── Program.cs
├── Properties
│ └── AssemblyInfo.cs
├── TestApp.csproj
└── packages.config
├── appveyor.yml
├── docs
└── Reference.md
├── oscript-component.sln
├── oscript-component
├── Properties
│ └── AssemblyInfo.cs
├── VerbalExpression.cs
├── oscript-component.csproj
└── packages.config
├── package-loader.os
├── packagedef
└── testcomponent.os
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | \.idea/
3 |
4 | \.vs/
5 |
6 | *.ospx
7 |
8 | bin/
9 | obj/
10 | packages/
11 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: csharp
2 | install:
3 | - wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
4 | - mono nuget.exe restore
5 | - mono nuget.exe install NUnit.ConsoleRunner -Version 3.6.1 -OutputDirectory testrunner
6 | script:
7 | - xbuild /p:Configuration=Release
8 | - mono ./testrunner/NUnit.ConsoleRunner.3.6.1/tools/nunit3-console.exe ./NUnitTests/bin/Release/NUnitTests.dll
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Nikita Gryzlov
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/NUnitTests/EngineHelpWrapper.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Reflection;
4 | using NUnit.Framework;
5 | using ScriptEngine.Machine.Contexts;
6 | using ScriptEngine.HostedScript.Library;
7 | using ScriptEngine.Machine;
8 | using ScriptEngine.Environment;
9 | using ScriptEngine.HostedScript;
10 |
11 | namespace NUnitTests
12 | {
13 | public class EngineHelpWrapper : IHostApplication
14 | {
15 |
16 | private HostedScriptEngine engine;
17 |
18 | public EngineHelpWrapper()
19 | {
20 | }
21 |
22 | public HostedScriptEngine Engine
23 | {
24 | get
25 | {
26 | return engine;
27 | }
28 | }
29 |
30 | public IValue TestRunner { get; private set; }
31 |
32 | public HostedScriptEngine StartEngine()
33 | {
34 | engine = new HostedScriptEngine();
35 | engine.Initialize();
36 |
37 | // Тут можно указать любой класс из компоненты
38 | engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(OnescriptVerbalExpressions.VerbalExpression)));
39 |
40 | // Если проектов компонент несколько, то надо взять по классу из каждой из них
41 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_2.MyClass_2)));
42 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_3.MyClass_3)));
43 |
44 | // Подключаем тестовую оболочку
45 | engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(EngineHelpWrapper)));
46 |
47 | var testrunnerSource = LoadFromAssemblyResource("NUnitTests.Tests.testrunner.os");
48 | var testrunnerModule = engine.GetCompilerService().CreateModule(testrunnerSource);
49 |
50 | {
51 | var mi = engine.GetType().GetMethod("SetGlobalEnvironment",
52 | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance);
53 | mi.Invoke(engine, new object[] {this, testrunnerSource});
54 | }
55 |
56 | engine.LoadUserScript(new ScriptEngine.UserAddedScript()
57 | {
58 | Type = ScriptEngine.UserAddedScriptType.Class,
59 | Module = testrunnerModule,
60 | Symbol = "TestRunner"
61 | });
62 |
63 | var testRunner = AttachedScriptsFactory.ScriptFactory("TestRunner", new IValue[] { });
64 | TestRunner = ValueFactory.Create(testRunner);
65 |
66 | return engine;
67 | }
68 |
69 | public void RunTestScript(string resourceName)
70 | {
71 | var source = LoadFromAssemblyResource(resourceName);
72 | var module = engine.GetCompilerService().CreateModule(source);
73 |
74 | engine.LoadUserScript(new ScriptEngine.UserAddedScript()
75 | {
76 | Type = ScriptEngine.UserAddedScriptType.Class,
77 | Module = module,
78 | Symbol = resourceName
79 | });
80 |
81 | var test = AttachedScriptsFactory.ScriptFactory(resourceName, new IValue[] { });
82 | ArrayImpl testArray;
83 | {
84 | int methodIndex = test.FindMethod("ПолучитьСписокТестов");
85 |
86 | {
87 | IValue ivTests;
88 | test.CallAsFunction(methodIndex, new IValue[] { TestRunner }, out ivTests);
89 | testArray = ivTests as ArrayImpl;
90 | }
91 | }
92 |
93 | foreach (var ivTestName in testArray)
94 | {
95 | string testName = ivTestName.AsString();
96 | int methodIndex = test.FindMethod(testName);
97 | if (methodIndex == -1)
98 | {
99 | // Тест указан, но процедуры нет или она не экспортирована
100 | continue;
101 | }
102 |
103 | test.CallAsProcedure(methodIndex, new IValue[] { });
104 | }
105 | }
106 |
107 | public ICodeSource LoadFromAssemblyResource(string resourceName)
108 | {
109 | var asm = System.Reflection.Assembly.GetExecutingAssembly();
110 | string codeSource;
111 |
112 | using (Stream s = asm.GetManifestResourceStream(resourceName))
113 | {
114 | using (StreamReader r = new StreamReader(s))
115 | {
116 | codeSource = r.ReadToEnd();
117 | }
118 | }
119 |
120 | return engine.Loader.FromString(codeSource);
121 | }
122 |
123 | public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary)
124 | {
125 | Console.WriteLine(str);
126 | }
127 |
128 | public string[] GetCommandLineArguments()
129 | {
130 | return new string[] { };
131 | }
132 |
133 | public bool InputString(out string result, int maxLen)
134 | {
135 | result = "";
136 | return false;
137 | }
138 |
139 | public void ShowExceptionInfo(Exception exc)
140 | {
141 | }
142 | }
143 | }
144 |
--------------------------------------------------------------------------------
/NUnitTests/MainTestClass.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using OnescriptVerbalExpressions;
3 |
4 | // Используется NUnit 3.6
5 |
6 | namespace NUnitTests
7 | {
8 | [TestFixture]
9 | public class MainTestClass
10 | {
11 |
12 | private EngineHelpWrapper host;
13 |
14 | [OneTimeSetUp]
15 | public void Initialize()
16 | {
17 | host = new EngineHelpWrapper();
18 | host.StartEngine();
19 | }
20 |
21 | [Test]
22 | public void TestAsInternalObjects()
23 | {
24 | var verbalExpression = new VerbalExpression();
25 |
26 | verbalExpression.Word().WithAnyCase(false);
27 |
28 | Assert.AreEqual(verbalExpression.ToStringImpl(), "\\w+");
29 |
30 | var oscriptRegExpImpl = verbalExpression.ToRegex();
31 | Assert.NotNull(oscriptRegExpImpl);
32 | }
33 |
34 |
35 | [Test]
36 | public void TestAsExternalObjects()
37 | {
38 | host.RunTestScript("NUnitTests.Tests.external.os");
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/NUnitTests/NUnitTests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {9A739C32-D551-43B0-920A-D9C53367BC38}
7 | Library
8 | NUnitTests
9 | NUnitTests
10 | v4.5
11 |
12 |
13 | true
14 | full
15 | false
16 | bin\Debug
17 | DEBUG;
18 | prompt
19 | 4
20 |
21 |
22 | true
23 | bin\Release
24 | prompt
25 | 4
26 |
27 |
28 |
29 |
30 | ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll
31 |
32 |
33 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll
34 |
35 |
36 | ..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll
37 |
38 |
39 | ..\packages\OneScript.1.0.16\lib\net40\ScriptEngine.dll
40 |
41 |
42 | ..\packages\OneScript.StandardLibrary.1.0.16\lib\net40\ScriptEngine.HostedScript.dll
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | {EA173D06-CCD2-45D5-A263-DC866289517A}
55 | oscript-component
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/NUnitTests/Tests/external.os:
--------------------------------------------------------------------------------
1 | Перем юТест;
2 |
3 | ////////////////////////////////////////////////////////////////////
4 | // Программный интерфейс
5 |
6 | Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
7 |
8 | юТест = ЮнитТестирование;
9 |
10 | ВсеТесты = Новый Массив;
11 |
12 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюРегЭкспаВСтроку");
13 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюРегЭкспаВРегЭксп");
14 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюСложногоРегЭкспаВСтроку");
15 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюКаналящегосяРегЭкспаВСтроку");
16 | ВсеТесты.Добавить("ТестДолжен_ПроверитьАнглийскиеСинонимы");
17 | ВсеТесты.Добавить("ТестДолжен_ПроверитьURL");
18 | ВсеТесты.Добавить("ТестДолжен_ПроверитьДиапазон");
19 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЛюбойДиапазон");
20 | ВсеТесты.Добавить("ТестДолжен_ПроверитьПовтор");
21 | ВсеТесты.Добавить("ТестДолжен_ПроверитьОдинИлиБольше");
22 | ВсеТесты.Добавить("ТестДолжен_ПроверитьМодификаторРегулярногоВыражения");
23 | ВсеТесты.Добавить("ТестДолжен_ПроверитьШорткаты");
24 |
25 | Возврат ВсеТесты;
26 |
27 | КонецФункции
28 |
29 | Процедура ТестДолжен_ПроверитьКомпиляциюРегЭкспаВСтроку() Экспорт
30 |
31 | ВербальноеВыражение = Новый ВербальноеВыражение();
32 |
33 | Результат = ВербальноеВыражение.ВСтроку();
34 |
35 | юТест.ПроверитьРавенство(Результат, "");
36 |
37 | КонецПроцедуры
38 |
39 | Процедура ТестДолжен_ПроверитьКомпиляциюРегЭкспаВРегЭксп() Экспорт
40 |
41 | ВербальноеВыражение = Новый ВербальноеВыражение();
42 |
43 | ВербальноеВыражение.ЧтоНибудьНоНе("№");
44 | Результат = ВербальноеВыражение.ВРегулярноеВыражение();
45 |
46 | юТест.ПроверитьРавенство(ТипЗнч(Результат), Тип("РегулярноеВыражение"));
47 | юТест.ПроверитьИстину(Результат.Совпадает("КакоеТоСлово"));
48 | юТест.ПроверитьЛожь(Результат.Совпадает("№"));
49 |
50 |
51 | КонецПроцедуры
52 |
53 | Процедура ТестДолжен_ПроверитьКомпиляциюСложногоРегЭкспаВСтроку() Экспорт
54 |
55 | ВербальноеВыражение = Новый ВербальноеВыражение();
56 |
57 | ВербальноеВыражение.Слово();
58 | Результат = ВербальноеВыражение.ВСтроку();
59 |
60 | юТест.ПроверитьРавенство(Результат, "\w+");
61 |
62 | КонецПроцедуры
63 |
64 | Процедура ТестДолжен_ПроверитьКомпиляциюКаналящегосяРегЭкспаВСтроку() Экспорт
65 |
66 | ВербальноеВыражение = Новый ВербальноеВыражение();
67 |
68 | Результат = Новый ВербальноеВыражение()
69 | .НачалоСтроки()
70 | .ЧтоУгодноНоНе("123")
71 | .ЧтоУгодно()
72 | .Слово()
73 | .МожетБыть("раз-два-три")
74 | .Слово()
75 | .КонецСтроки()
76 | .ВСтроку();
77 |
78 | юТест.ПроверитьРавенство(Результат, "^([^123]*)(.*)\w+(раз-два-три)?\w+$");
79 |
80 | КонецПроцедуры
81 |
82 | Процедура ТестДолжен_ПроверитьАнглийскиеСинонимы() Экспорт
83 |
84 | ВербальноеВыражение = Новый VerbalExpression();
85 |
86 | ВербальноеВыражение.Word();
87 | Результат = ВербальноеВыражение.ToString();
88 |
89 | юТест.ПроверитьРавенство(Результат, "\w+");
90 |
91 | КонецПроцедуры
92 |
93 | Процедура ТестДолжен_ПроверитьURL() Экспорт
94 |
95 | // На выходе - (((http)(s)?)|(ftp))(://)(.+)
96 | ВербальноеВыражение = Новый ВербальноеВыражение()
97 | .Найти(
98 | Новый ВербальноеВыражение()
99 | .Найти("http")
100 | .МожетБыть("s")
101 | .Либо("ftp")
102 | .ВСтроку(),
103 | Ложь
104 | )
105 | .Затем("://")
106 | .ЧтоНибудь();
107 |
108 | РегулярноеВыражение = ВербальноеВыражение.ВРегулярноеВыражение();
109 |
110 | юТест.ПроверитьИстину(РегулярноеВыражение.Совпадает("https://google.com"));
111 | юТест.ПроверитьИстину(РегулярноеВыражение.Совпадает("http://google.com"));
112 | юТест.ПроверитьИстину(РегулярноеВыражение.Совпадает("ftp://google.com"));
113 | юТест.ПроверитьЛожь(РегулярноеВыражение.Совпадает("http://"));
114 | юТест.ПроверитьЛожь(РегулярноеВыражение.Совпадает("фывфывфыв://asdasd"));
115 |
116 | КонецПроцедуры
117 |
118 | Процедура ТестДолжен_ПроверитьДиапазон() Экспорт
119 |
120 | ВербальноеВыражение = Новый ВербальноеВыражение();
121 | ВербальноеВыражение.Диапазон("0", "9");
122 |
123 | Результат = ВербальноеВыражение.ВСтроку();
124 |
125 | юТест.ПроверитьРавенство(Результат, "[0-9]");
126 |
127 | КонецПроцедуры
128 |
129 | Процедура ТестДолжен_ПроверитьЛюбойДиапазон() Экспорт
130 |
131 | ВербальноеВыражение = Новый ВербальноеВыражение();
132 | ВербальноеВыражение.ЛюбойИз("123абв");
133 |
134 | Результат = ВербальноеВыражение.ВСтроку();
135 |
136 | юТест.ПроверитьРавенство(Результат, "[123абв]");
137 |
138 | КонецПроцедуры
139 |
140 | Процедура ТестДолжен_ПроверитьПовтор() Экспорт
141 |
142 | Результат = Новый ВербальноеВыражение()
143 | .Найти("а")
144 | .ПовторитьПредыдущее(1)
145 | .ВСтроку();
146 |
147 | юТест.ПроверитьРавенство(Результат, "(а){1}");
148 |
149 | Результат = Новый ВербальноеВыражение()
150 | .Найти("а")
151 | .ПовторитьПредыдущееОтИДо(1, 2)
152 | .ВСтроку();
153 |
154 | юТест.ПроверитьРавенство(Результат, "(а){1,2}");
155 |
156 | КонецПроцедуры
157 |
158 |
159 | Процедура ТестДолжен_ПроверитьОдинИлиБольше() Экспорт
160 |
161 | Результат = Новый ВербальноеВыражение()
162 | .Найти("а")
163 | .ОдинИлиБольше()
164 | .ВСтроку();
165 |
166 | юТест.ПроверитьРавенство(Результат, "(а)+");
167 |
168 | Результат = Новый ВербальноеВыражение()
169 | .ОдинИлиБольше("а")
170 | .ВСтроку();
171 |
172 | юТест.ПроверитьРавенство(Результат, "(а)+");
173 |
174 | КонецПроцедуры
175 |
176 | Процедура ТестДолжен_ПроверитьМодификаторРегулярногоВыражения() Экспорт
177 |
178 | Результат = Новый ВербальноеВыражение()
179 | .Найти("а")
180 | .СЛюбымРегистром(Истина)
181 | .ВРегулярноеВыражение();
182 |
183 | юТест.ПроверитьИстину(Результат.Совпадает("А"));
184 |
185 | Результат = Новый ВербальноеВыражение()
186 | .Найти("а")
187 | .СЛюбымРегистром(Ложь)
188 | .ВРегулярноеВыражение();
189 |
190 | юТест.ПроверитьЛожь(Результат.Совпадает("А"));
191 |
192 | КонецПроцедуры
193 |
194 | Процедура ТестДолжен_ПроверитьШорткаты() Экспорт
195 |
196 | Результат = Новый ВербальноеВыражение()
197 | .Число()
198 | .Число()
199 | .ПробельныйСимвол()
200 | .ВРегулярноеВыражение();
201 |
202 | юТест.ПроверитьИстину(Результат.Совпадает("12 "));
203 | юТест.ПроверитьЛожь(Результат.Совпадает("ф"));
204 |
205 | КонецПроцедуры
206 |
--------------------------------------------------------------------------------
/NUnitTests/Tests/testrunner.os:
--------------------------------------------------------------------------------
1 | //////////////////////////////////////////////////////////////////
2 | //
3 | // Объект-помощник для приемочного и юнит-тестирования (урезанный testrunner)
4 | //
5 | //////////////////////////////////////////////////////////////////
6 |
7 | Перем Пути;
8 | Перем КомандаЗапуска;
9 | Перем НаборТестов;
10 | Перем РезультатТестирования;
11 |
12 | Перем ПутьЛогФайлаJUnit;
13 |
14 | Перем НомерТестаДляЗапуска;
15 | Перем НаименованиеТестаДляЗапуска;
16 |
17 | Перем Рефлектор;
18 |
19 | Перем ЗначенияСостоянияТестов;
20 | Перем СтруктураПараметровЗапуска;
21 |
22 | Перем НаборОшибок;
23 | Перем НаборНереализованныхТестов;
24 |
25 | Перем ВсегоТестов;
26 | Перем ВыводитьОшибкиПодробно;
27 |
28 | Перем ВременныеФайлы;
29 |
30 | //////////////////////////////////////////////////////////////////////////////
31 | // Программный интерфейс
32 | //
33 |
34 | Функция ФорматДСО(ДопСообщениеОшибки)
35 | Если ДопСообщениеОшибки = "" Тогда
36 | Возврат "";
37 | КонецЕсли;
38 |
39 | Возврат Символы.ПС + ДопСообщениеОшибки;
40 | КонецФункции
41 |
42 | Функция ПредставлениеПериода(ДатаНачала, ДатаОкончания, ФорматнаяСтрока = Неопределено)
43 | Возврат "с "+ДатаНачала+" по "+ДатаОкончания;
44 | КонецФункции
45 |
46 | Процедура ПодробныеОписанияОшибок(Знач ВключитьПодробноеОписание) Экспорт
47 | ВыводитьОшибкиПодробно = ВключитьПодробноеОписание;
48 | КонецПроцедуры
49 |
50 | //{ МЕТОДЫ ДЛЯ ПРОВЕРКИ ЗНАЧЕНИЙ (assertions).
51 |
52 | Процедура Проверить(Условие, ДопСообщениеОшибки = "") Экспорт
53 | Если Не Условие Тогда
54 | СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Истиной, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки);
55 | ВызватьИсключение(СообщениеОшибки);
56 | КонецЕсли;
57 | КонецПроцедуры
58 |
59 | Процедура ПроверитьИстину(Условие, ДопСообщениеОшибки = "") Экспорт
60 | Проверить(Условие, ДопСообщениеОшибки);
61 | КонецПроцедуры
62 |
63 | Процедура ПроверитьЛожь(Условие, ДопСообщениеОшибки = "") Экспорт
64 | Если Условие Тогда
65 | СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Ложью, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки);
66 | ВызватьИсключение(СообщениеОшибки);
67 | КонецЕсли;
68 | КонецПроцедуры
69 |
70 | Процедура ПроверитьДату(_Дата, _Период, ДопСообщениеОшибки = "") Экспорт
71 | Если _Дата < _Период.ДатаНачала или _Дата > _Период.ДатаОкончания Тогда
72 | представление = ПредставлениеПериода(_Период.ДатаНачала, _Период.ДатаОкончания, "ФП = Истина");
73 | СообщениеОшибки = "Переданный параметр ("+Формат(_Дата, "ДФ='dd.MM.yyyy HH:mm:ss'")+") не входит в период "+представление+", а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки);
74 | ВызватьИсключение(СообщениеОшибки);
75 | КонецЕсли;
76 | КонецПроцедуры
77 |
78 | Процедура ПроверитьРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт
79 | Если ПервоеЗначение <> ВтороеЗначение Тогда
80 | СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") не равны, а хотели, чтобы были равны." + ФорматДСО(ДопСообщениеОшибки);
81 | ВызватьИсключение(СообщениеОшибки);
82 | КонецЕсли;
83 | КонецПроцедуры
84 |
85 | Процедура ПроверитьНеРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт
86 | Если ПервоеЗначение = ВтороеЗначение Тогда
87 | СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") равны, а хотели, чтобы были не равны." + ФорматДСО(ДопСообщениеОшибки);
88 | ВызватьИсключение(СообщениеОшибки);
89 | КонецЕсли;
90 | КонецПроцедуры
91 |
92 | Процедура ПроверитьБольше(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт
93 | Если _Больше <= _Меньше Тогда
94 | СообщениеОшибки = "Первый параметр ("+_Больше+") меньше или равен второму ("+_Меньше+") а хотели, чтобы был больше." + ФорматДСО(ДопСообщениеОшибки);
95 | ВызватьИсключение(СообщениеОшибки);
96 | КонецЕсли;
97 | КонецПроцедуры
98 |
99 | Процедура ПроверитьБольшеИлиРавно(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт
100 | Если _Больше < _Меньше Тогда
101 | СообщениеОшибки = "Первый параметр ("+_Больше+") меньше второго ("+_Меньше+") а хотели, чтобы был больше или равен." + ФорматДСО(ДопСообщениеОшибки);
102 | ВызватьИсключение(СообщениеОшибки);
103 | КонецЕсли;
104 | КонецПроцедуры
105 |
106 | Процедура ПроверитьМеньше(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт
107 | Если проверяемоеЗначение1 >= проверяемоеЗначение2 Тогда
108 | ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше или равно, чем <"+проверяемоеЗначение2+">, а ожидалось меньше"+
109 | ФорматДСО(СообщениеОбОшибке);
110 | КонецЕсли;
111 | КонецПроцедуры
112 |
113 | Процедура ПроверитьМеньшеИлиРавно(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт
114 | Если проверяемоеЗначение1 > проверяемоеЗначение2 Тогда
115 | ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше, чем <"+проверяемоеЗначение2+">, а ожидалось меньше или равно"+
116 | ФорматДСО(СообщениеОбОшибке);
117 | КонецЕсли;
118 | КонецПроцедуры
119 |
120 | // проверка идет через ЗначениеЗаполнено, но мутабельные значение всегда считаем заполненными
121 | Процедура ПроверитьЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт
122 | Попытка
123 | фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение);
124 | Исключение
125 | Возврат;
126 | КонецПопытки;
127 | Если НЕ фЗаполнено Тогда
128 | ВызватьИсключение "Значение ("+ПроверяемоеЗначение+") не заполнено, а ожидалась заполненность" + ФорматДСО(ДопСообщениеОшибки);
129 | КонецЕсли;
130 | КонецПроцедуры
131 |
132 | Процедура ПроверитьНеЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт
133 | СообщениеОшибки = "Значение ("+ПроверяемоеЗначение+") заполнено, а ожидалась незаполненность" + ФорматДСО(ДопСообщениеОшибки);
134 | Попытка
135 | фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение);
136 | Исключение
137 | ВызватьИсключение СообщениеОшибки;
138 | КонецПопытки;
139 | Если фЗаполнено Тогда
140 | ВызватьИсключение СообщениеОшибки;
141 | КонецЕсли;
142 | КонецПроцедуры
143 |
144 | Процедура ПроверитьВхождение(строка, подстрокаПоиска, ДопСообщениеОшибки = "") Экспорт
145 | Если Найти(строка, подстрокаПоиска) = 0 Тогда
146 | СообщениеОшибки = "Искали в <"+строка+"> подстроку <"+подстрокаПоиска+">, но не нашли." + ФорматДСО(ДопСообщениеОшибки);
147 | ВызватьИсключение(СообщениеОшибки);
148 | КонецЕсли;
149 | КонецПроцедуры
150 |
151 | Процедура ТестПройден() Экспорт
152 | КонецПроцедуры
153 |
154 | Процедура ТестПровален(ДопСообщениеОшибки) Экспорт
155 | СообщениеОшибки = "Тест провален." + ФорматДСО(ДопСообщениеОшибки);
156 | ВызватьИсключение(СообщениеОшибки);
157 | КонецПроцедуры
158 |
159 | //}
160 |
161 | // { временные файлы
162 | Функция ИмяВременногоФайла(Знач Расширение = "tmp") Экспорт
163 | Если ВременныеФайлы = Неопределено Тогда
164 | ВременныеФайлы = Новый Массив;
165 | КонецЕсли;
166 |
167 | ИмяВремФайла = ПолучитьИмяВременногоФайла(Расширение);
168 | ВременныеФайлы.Добавить(ИмяВремФайла);
169 | Возврат ИмяВремФайла;
170 | КонецФункции
171 |
172 | Процедура УдалитьВременныеФайлы() Экспорт
173 |
174 | Если ВременныеФайлы <> Неопределено Тогда
175 | Для Каждого ИмяФайла Из ВременныеФайлы Цикл
176 | Попытка
177 | УдалитьФайлы(ИмяФайла);
178 | Исключение
179 | Сообщить("Не удален временный файл: " + ИмяФайла + "
180 | |-" + ОписаниеОшибки());
181 | КонецПопытки;
182 | КонецЦикла;
183 |
184 | ВременныеФайлы.Очистить();
185 |
186 | КонецЕсли;
187 |
188 | КонецПроцедуры
189 | // }
190 | Функция ВСтрокеСодержатсяТолькоЦифры(Знач ИсходнаяСтрока) Экспорт
191 |
192 | рез = Ложь;
193 | ДлинаСтроки = СтрДлина(ИсходнаяСтрока);
194 | Для Сч = 1 По ДлинаСтроки Цикл
195 | ТекущийСимвол = КодСимвола(Сред(ИсходнаяСтрока, Сч, 1));
196 | Если 48 <= ТекущийСимвол И ТекущийСимвол <= 57 Тогда
197 | рез = Истина;
198 | Иначе
199 | рез = Ложь;
200 | Прервать;
201 | КонецЕсли;
202 | КонецЦикла;
203 | Возврат рез;
204 | КонецФункции
205 |
206 | // Выводит сообщение. В тестах ВСЕГДА должна использоваться ВМЕСТО метода Сообщить().
207 | //
208 |
209 | Функция ВывестиПредупреждение(Ошибка) Экспорт
210 |
211 | НужныйТекстОшибки = Ошибка;
212 |
213 | ВывестиСообщение("ПРЕДУПРЕЖДЕНИЕ: " + НужныйТекстОшибки, СтатусСообщения.Внимание);
214 |
215 | Возврат НужныйТекстОшибки;
216 | КонецФункции
217 |
218 | Функция ВывестиСообщение(ТекстСообщения, Статус = Неопределено) Экспорт
219 | Если Статус = Неопределено Тогда
220 | Статус = СтатусСообщения.Обычное;
221 | КонецЕсли;
222 |
223 | Сообщить(ТекстСообщения, Статус);
224 | КонецФункции
225 |
226 | // Вызывает исключение с заданным текстом ошибки для прерывания выполнения тестового случая.
227 | //
228 | Функция ПрерватьТест(ТекстОшибки) Экспорт
229 |
230 | ВызватьИсключение ТекстОшибки;
231 |
232 | КонецФункции
233 |
234 | Функция ВывестиОшибку(Ошибка) Экспорт
235 |
236 | НужныйТекстОшибки = Ошибка;
237 |
238 | ВывестиСообщение("ОШИБКА: " + НужныйТекстОшибки, СтатусСообщения.Важное);
239 |
240 | Возврат НужныйТекстОшибки;
241 | КонецФункции
242 |
243 | ВыводитьОшибкиПодробно = Ложь;
244 |
245 |
--------------------------------------------------------------------------------
/NUnitTests/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OneScript Verbal Expressions
2 |
3 | [](https://ci.appveyor.com/project/nixel2007/verbal-expressions/branch/develop)
4 | [](https://travis-ci.org/oscript-library/verbal-expressions)
5 |
6 | ## Регулярные выражения - это просто!
7 |
8 | verbal-expressions - это библиотека для OneScript, помогающая собирать сложные регулярные выражения.
9 |
10 | ## Установка
11 |
12 | ### С хаба пакетов
13 |
14 | `opm install verbal-expressions`
15 |
16 | ### С релизов GitHub
17 |
18 | 1. Перейти на [страницу релизов](https://github.com/oscript-library/verbal-expessions/releases)
19 | 1. Скачать артефакт verbal-expressions-x.y.z.ospx
20 | 1. Установить с помощью opm: `opm install -f verbal-expressions-x.y.z.ospx`
21 |
22 | ### С AppVeyor
23 |
24 | 1. Перейти на страницу [последней сборки](https://ci.appveyor.com/project/nixel2007/verbal-expressions) или [истории сборок](https://ci.appveyor.com/project/nixel2007/verbal-expressions/history) и выбрать интересующую сборку
25 | 1. Перейти в раздел Artifacts
26 | 1. Скачать артефакт verbal-expressions-x.y.z.ospx
27 | 1. Установить с помощью opm: `opm install -f verbal-expressions-x.y.z.ospx`
28 |
29 | ## Использование
30 |
31 | Несколько примеров использования Вербальных выражений:
32 |
33 | ### Проверка валидности URL
34 |
35 | ```bsl
36 | #Использовать verbal-expressions
37 |
38 | // Проверим корректность формирования URL
39 |
40 | ВербальноеВыражение = Новый ВербальноеВыражение()
41 | .НачалоСтроки()
42 | .Затем("http")
43 | .МожетБыть("s")
44 | .Затем("://")
45 | .ЧтоНибудьНоНе(" ")
46 | .КонецСтроки();
47 |
48 | ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку();
49 | Сообщить(ТекстРегулярногоВыражения); // ^(http)(s)?(://)([^ ]+)$
50 |
51 | РегулярноеВыражение = ВербальноеВыражение.ВРегулярноеВыражение();
52 | ПроверяемаяСтрока = "https://www.google.com";
53 |
54 | Если РегулярноеВыражение.Совпадает(ПроверяемаяСтрока) Тогда
55 | Сообщить("URL корректен");
56 | Иначе
57 | Сообщить("URL некорректен");
58 | КонецЕсли;
59 | ```
60 |
61 | ### Вложенное "или"
62 |
63 | ```bsl
64 | #Использовать verbal-expressions
65 |
66 | // Проверим корректность формирования URL. Допустимые схемы - http[s] и ftp
67 |
68 | ЭкранироватьПереданноеЗначение = Ложь;
69 |
70 | ВербальноеВыражение = Новый ВербальноеВыражение()
71 | .НачалоСтроки()
72 | .Затем(
73 | Новый ВербальноеВыражение()
74 | .Найти("http")
75 | .МожетБыть("s")
76 | .Либо("ftp")
77 | .ВСтроку(),
78 | ЭкранироватьПереданноеЗначение
79 | )
80 | .Затем("://")
81 | .ЧтоНибудьНоНе(" ")
82 | .КонецСтроки();
83 |
84 | ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку();
85 | Сообщить(ТекстРегулярногоВыражения); // ^(((http)(s)?)|(ftp))(://)([^ ]+)$
86 | ```
87 |
88 | Больше примеров в [файле с приемочными тестами](https://github.com/oscript-library/verbal-expessions/blob/master/NUnitTests/Tests/external.os).
89 |
90 | ## Список методов
91 |
92 | Список методов и их описание доступно в файле [docs/Reference.md](docs/Reference.md)
93 |
94 | ## ToDo
95 |
96 | * Пробросить методы объекта РегулярноеВыражение в ВербальноеВыражение для упрощения использования
97 | * Добавить новых ништяков
98 |
99 |
--------------------------------------------------------------------------------
/TestApp/Program.cs:
--------------------------------------------------------------------------------
1 | // Исполняемое приложение для запуска компоненты под отладчиком
2 |
3 | // В проекте TestApp в "Ссылки" ("References") должен быть добавлен проект компоненты
4 | // В проекте TestApp должны быть подключены NuGet пакеты OneScript и OneScript.Library
5 |
6 | using System;
7 | using ScriptEngine.HostedScript;
8 | using ScriptEngine.HostedScript.Library;
9 |
10 | namespace TestApp
11 | {
12 | class MainClass : IHostApplication
13 | {
14 |
15 | static readonly string SCRIPT = @"// Отладочный скрипт
16 | // в котором уже подключена наша компонента
17 | Слагаемое1 = Новый Слагаемое(5);
18 | Слагаемое2 = Новый Слагаемое(Слагаемое1);
19 |
20 | Складыватель = Новый Сложение;
21 | Складыватель.ДобавитьСлагаемое(Слагаемое1);
22 | Складыватель.ДобавитьСлагаемое(Слагаемое2);
23 | //Складыватель.ДобавитьСлагаемое('20150601');
24 |
25 | Сумма = Складыватель.Вычислить();
26 |
27 | Сообщить(""Получилось: "" + Сумма);
28 | "
29 | ;
30 |
31 | public static HostedScriptEngine StartEngine()
32 | {
33 | var engine = new ScriptEngine.HostedScript.HostedScriptEngine();
34 | engine.Initialize();
35 |
36 | // Тут можно указать любой класс из компоненты
37 | engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(OnescriptVerbalExpressions.VerbalExpression)));
38 |
39 | // Если проектов компонент несколько, то надо взять по классу из каждой из них
40 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_2.MyClass_2)));
41 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_3.MyClass_3)));
42 |
43 | return engine;
44 | }
45 |
46 | public static void Main(string[] args)
47 | {
48 | var engine = StartEngine();
49 | var script = engine.Loader.FromString(SCRIPT);
50 | var process = engine.CreateProcess(new MainClass(), script);
51 |
52 | var result = process.Start(); // Запускаем наш тестовый скрипт
53 |
54 | Console.WriteLine("Result = {0}", result);
55 |
56 | // ВАЖНО: движок перехватывает исключения, для отладки можно пользоваться только точками останова.
57 | }
58 |
59 | public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary)
60 | {
61 | Console.WriteLine(str);
62 | }
63 |
64 | public void ShowExceptionInfo(Exception exc)
65 | {
66 | Console.WriteLine(exc.ToString());
67 | }
68 |
69 | public bool InputString(out string result, int maxLen)
70 | {
71 | throw new NotImplementedException();
72 | }
73 |
74 | public string[] GetCommandLineArguments()
75 | {
76 | return new string[] { "1", "2", "3" }; // Здесь можно зашить список аргументов командной строки
77 | }
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/TestApp/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 |
4 | // Information about this assembly is defined by the following attributes.
5 | // Change them to the values specific to your project.
6 |
7 | [assembly: AssemblyTitle("TestApp")]
8 | [assembly: AssemblyDescription("")]
9 | [assembly: AssemblyConfiguration("")]
10 | [assembly: AssemblyCompany("")]
11 | [assembly: AssemblyProduct("")]
12 | [assembly: AssemblyCopyright("${AuthorCopyright}")]
13 | [assembly: AssemblyTrademark("")]
14 | [assembly: AssemblyCulture("")]
15 |
16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision,
18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision.
19 |
20 | [assembly: AssemblyVersion("1.0.*")]
21 |
22 | // The following attributes are used to specify the signing key for the assembly,
23 | // if desired. See the Mono documentation for more information about signing.
24 |
25 | //[assembly: AssemblyDelaySign(false)]
26 | //[assembly: AssemblyKeyFile("")]
27 |
28 |
--------------------------------------------------------------------------------
/TestApp/TestApp.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}
7 | Exe
8 | TestApp
9 | TestApp
10 | v4.5
11 |
12 |
13 | true
14 | full
15 | false
16 | bin\Debug
17 | DEBUG;
18 | prompt
19 | 4
20 | true
21 |
22 |
23 | true
24 | bin\Release
25 | prompt
26 | 4
27 | true
28 |
29 |
30 |
31 |
32 | ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll
33 |
34 |
35 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll
36 |
37 |
38 | ..\packages\OneScript.1.0.16\lib\net40\ScriptEngine.dll
39 |
40 |
41 | ..\packages\OneScript.StandardLibrary.1.0.16\lib\net40\ScriptEngine.HostedScript.dll
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | {EA173D06-CCD2-45D5-A263-DC866289517A}
51 | oscript-component
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/TestApp/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/appveyor.yml:
--------------------------------------------------------------------------------
1 | version: 1.0.{build}
2 | environment:
3 | main_project: oscript-component
4 | before_build:
5 | - ps: nuget restore
6 | init:
7 | - ps: Set-WinSystemLocale ru-RU
8 | - ps: Start-Sleep -s 5
9 | - ps: Restart-Computer
10 | install:
11 | - cmd: >-
12 | mkdir engine
13 |
14 | cd engine
15 |
16 | appveyor DownloadFile http://oscript.io/downloads/latest/exe -FileName os.exe
17 |
18 | os.exe /silent
19 |
20 | set PATH=%ProgramFiles(x86)%\OneScript\bin;%PATH%
21 |
22 | cd ..
23 |
24 | appveyor DownloadFile https://github.com/dmpas/OneScriptDocumenter/releases/download/1.0.13/documenter.zip -FileName OneScriptDocumenter.zip
25 |
26 | 7z x OneScriptDocumenter.zip > NUL
27 |
28 | oscript -version
29 |
30 | opm install opm
31 |
32 | build:
33 | verbosity: minimal
34 | configuration: Release
35 | test_script:
36 | - cmd: nunit3-console --x86 NUnitTests\bin\%CONFIGURATION%\NUnitTests.dll
37 |
38 | after_build:
39 | - cmd: >-
40 |
41 | del %main_project%\bin\%CONFIGURATION%\*.pdb
42 |
43 | mkdir bin
44 |
45 | OneScriptDocumenter.exe json bin\syntaxHelp.json %main_project%\bin\%CONFIGURATION%\%main_project%.dll
46 |
47 | del %main_project%\bin\%CONFIGURATION%\ScriptEngine*.* %main_project%\bin\%CONFIGURATION%\NewtonSoft*.* %main_project%\bin\%CONFIGURATION%\DotNetZip*.*
48 |
49 | xcopy %main_project%\bin\%CONFIGURATION%\* bin\
50 |
51 | opm build .
52 |
53 | artifacts:
54 | - path: .\*.ospx
55 | name: component
56 |
--------------------------------------------------------------------------------
/docs/Reference.md:
--------------------------------------------------------------------------------
1 |
2 | # ВербальноеВыражение / VerbalExpression
3 |
4 |
5 |
6 | Класс предоставляет объектную модель для построения регулярных выражений.
7 |
8 |
9 |
10 |
11 | ## Методы
12 |
13 | ### ВРегулярноеВыражение / ToRegex()
14 |
15 |
16 |
17 | Преобразует объект в РегулярноеВыражение.
18 |
19 |
20 |
21 |
22 | #### Возвращаемое значение
23 |
24 | Объект РегулярноеВыражение с заполненным шаблоном поиска и флагами
25 |
26 |
27 | ### ВСтроку / ToString()
28 |
29 |
30 |
31 | Преобразует объект в строку.
32 |
33 |
34 |
35 |
36 | #### Возвращаемое значение
37 |
38 | Текст регулярного выражения в виде строки
39 |
40 |
41 | ### Найти / Find()
42 |
43 |
44 |
45 | Ищет в строке определенное значение. То же самое, что и `Затем()`.
46 |
47 |
48 |
49 |
50 | #### Параметры
51 |
52 | * *value*: Искомое значение
53 |
54 | * *sanitize*: Экранировать переданное значение
55 |
56 | #### Возвращаемое значение
57 |
58 | ВербальноеВыражение
59 |
60 |
61 | ### Затем / Then()
62 |
63 |
64 |
65 | Ищет в строке определенное значение. То же самое, что и `Найти()`.
66 |
67 |
68 |
69 |
70 | #### Параметры
71 |
72 | * *value*: Искомое значение
73 |
74 | * *sanitize*: Экранировать переданное значение
75 |
76 | #### Возвращаемое значение
77 |
78 | ВербальноеВыражение
79 |
80 |
81 | ### Либо / Or()
82 |
83 |
84 |
85 | Добавление условия ИЛИ в выражение.
86 |
87 |
88 |
89 |
90 | #### Параметры
91 |
92 | * *value*: Искомое значение
93 |
94 | * *sanitize*: Экранировать переданное значение
95 |
96 | #### Возвращаемое значение
97 |
98 | ВербальноеВыражение
99 |
100 |
101 | ### ЧтоУгодно / Anything()
102 |
103 |
104 |
105 | Поиск "чего угодно", в том числе отсутствия символов.
106 |
107 |
108 |
109 |
110 | #### Возвращаемое значение
111 |
112 | ВербальноеВыражение
113 |
114 |
115 | ### ЧтоУгодноНоНе / AnythingBut()
116 |
117 |
118 |
119 | Поиск "чего угодно, кроме" указанных символов, в том числе их отсутствие.
120 |
121 |
122 |
123 |
124 | #### Параметры
125 |
126 | * *value*: Искомое значение
127 |
128 | * *sanitize*: Экранировать переданное значение
129 |
130 | #### Возвращаемое значение
131 |
132 | ВербальноеВыражение
133 |
134 |
135 | ### ЧтоНибудь / Something()
136 |
137 |
138 |
139 | Поиск "чего-нибудь" - любого символа хотя бы один раз.
140 |
141 |
142 |
143 |
144 | #### Возвращаемое значение
145 |
146 | ВербальноеВыражение
147 |
148 |
149 | ### ЧтоНибудьНоНе / SomethingBut()
150 |
151 |
152 |
153 | Поиск "чего-нибудь, кроме" указанных символов хотя бы один раз.
154 |
155 |
156 |
157 |
158 | #### Параметры
159 |
160 | * *value*: Искомое значение
161 |
162 | * *sanitize*: Экранировать переданное значение
163 |
164 | #### Возвращаемое значение
165 |
166 | ВербальноеВыражение
167 |
168 |
169 | ### МожетБыть / Maybe()
170 |
171 |
172 |
173 | Поиск необязательного значения.
174 |
175 |
176 |
177 |
178 | #### Параметры
179 |
180 | * *value*: Искомое значение
181 |
182 | * *sanitize*: Экранировать переданное значение
183 |
184 | #### Возвращаемое значение
185 |
186 | ВербальноеВыражение
187 |
188 |
189 | ### НачалоСтроки / StartOfLine()
190 |
191 |
192 |
193 | Добавляет в поиск префикс "начала строки".
194 |
195 |
196 |
197 |
198 | #### Возвращаемое значение
199 |
200 | ВербальноеВыражение
201 |
202 |
203 | ### КонецСтроки / EndOfLine()
204 |
205 |
206 |
207 | Добавляет в поиск суффикс "конца строки".
208 |
209 |
210 |
211 |
212 | #### Возвращаемое значение
213 |
214 | ВербальноеВыражение
215 |
216 |
217 | ### ПереводСтроки / LineBreak()
218 |
219 |
220 |
221 | Перевод строки.
222 |
223 |
224 |
225 |
226 | #### Возвращаемое значение
227 |
228 | ВербальноеВыражение
229 |
230 |
231 | ### ПС / LF()
232 |
233 |
234 |
235 | Перевод строки.
236 |
237 |
238 |
239 |
240 | #### Возвращаемое значение
241 |
242 | ВербальноеВыражение
243 |
244 |
245 | ### Отступ / Tab()
246 |
247 |
248 |
249 | Символ табуляции.
250 |
251 |
252 |
253 |
254 | #### Возвращаемое значение
255 |
256 | ВербальноеВыражение
257 |
258 |
259 | ### Слово / Word()
260 |
261 |
262 |
263 | Буквенно-цифровая последовательность символов.
264 |
265 |
266 |
267 |
268 | #### Возвращаемое значение
269 |
270 | ВербальноеВыражение
271 |
272 |
273 | ### Число / Digit()
274 |
275 |
276 |
277 | Любое число.
278 |
279 |
280 |
281 |
282 | #### Возвращаемое значение
283 |
284 | ВербальноеВыражение
285 |
286 |
287 | ### ПробельныйСимвол / Whitespace()
288 |
289 |
290 |
291 | Любой пробельный символ.
292 |
293 |
294 |
295 |
296 | #### Возвращаемое значение
297 |
298 | ВербальноеВыражение
299 |
300 |
301 | ### Диапазон / Range()
302 |
303 |
304 |
305 | Диапазон символов.
306 |
307 |
308 |
309 |
310 | #### Параметры
311 |
312 | * *from*: Нижняя граница диапазона
313 |
314 | * *to*: Верхняя граница диапазона
315 |
316 | #### Возвращаемое значение
317 |
318 | ВербальноеВыражение
319 |
320 |
321 | ### Любой / Any()
322 |
323 |
324 |
325 | Любой из указанных символов. То же самое, что и `ЛюбойИз()`
326 |
327 |
328 |
329 |
330 | #### Параметры
331 |
332 | * *value*: Искомое значение
333 |
334 | #### Возвращаемое значение
335 |
336 | ВербальноеВыражение
337 |
338 |
339 | ### ЛюбойИз / AnyOf()
340 |
341 |
342 |
343 | Любой из указанных символов. То же самое, что и `Любой()`
344 |
345 |
346 |
347 |
348 | #### Параметры
349 |
350 | * *value*: Искомое значение
351 |
352 | #### Возвращаемое значение
353 |
354 | ВербальноеВыражение
355 |
356 |
357 | ### ОдинИлиБольше / OneOrMore()
358 |
359 |
360 |
361 | Поиск "одного или более".
362 | Если передан параметр `value`, то мультипликатор применяется к нему.
363 | Если параметр `value` не передан, то мультипликатор применяется к предыдущей группе регулярного выражения.
364 |
365 |
366 |
367 |
368 | #### Параметры
369 |
370 | * *value*: Искомое значение
371 |
372 | * *sanitize*: Экранировать переданное значение
373 |
374 | #### Возвращаемое значение
375 |
376 | ВербальноеВыражение
377 |
378 |
379 | ### НачатьЗахват / BeginCapture()
380 |
381 |
382 |
383 | Начать захват группы.
384 |
385 |
386 |
387 |
388 | #### Параметры
389 |
390 | * *groupName*: Имя группы
391 |
392 | #### Возвращаемое значение
393 |
394 | ВербальноеВыражение
395 |
396 |
397 | ### ЗакончитьЗахват / EndCapture()
398 |
399 |
400 |
401 | Закончить захват группы.
402 |
403 |
404 |
405 |
406 | #### Возвращаемое значение
407 |
408 | ВербальноеВыражение
409 |
410 |
411 | ### ПовторитьПредыдущее / RepeatPrevious()
412 |
413 |
414 |
415 | Повторить предыдущую группу поиска n раз.
416 |
417 |
418 |
419 |
420 | #### Параметры
421 |
422 | * *n*: Число повторений
423 |
424 | #### Возвращаемое значение
425 |
426 | ВербальноеВыражение
427 |
428 |
429 | ### ПовторитьПредыдущееОтИДо / RepeatPreviousFromAndTo()
430 |
431 |
432 |
433 | Повторить предыдущую группу поиска от n до m раз.
434 |
435 |
436 |
437 |
438 | #### Параметры
439 |
440 | * *n*: Нижняя гранница
441 |
442 | * *m*: Верхняя граница
443 |
444 | #### Возвращаемое значение
445 |
446 | ВербальноеВыражение
447 |
448 |
449 | ### СЛюбымРегистром / WithAnyCase()
450 |
451 |
452 |
453 | Включить поиск без учета регистра символов.
454 |
455 |
456 |
457 |
458 | #### Параметры
459 |
460 | * *enable*: Флаг включения/выключения поиска
461 |
462 | #### Возвращаемое значение
463 |
464 | ВербальноеВыражение
465 |
466 |
467 | ### ОднострочныйПоиск / SearchOneLine()
468 |
469 |
470 |
471 | Включить поиск только по одной строке.
472 |
473 |
474 |
475 |
476 | #### Параметры
477 |
478 | * *enable*: Флаг включения/выключения поиска
479 |
480 | #### Возвращаемое значение
481 |
482 | ВербальноеВыражение
483 |
484 |
485 | ### ДобавитьМодификатор / AddModifier()
486 |
487 |
488 |
489 | Добавление модификатора регулярного выражения.
490 | Допустимые значения: i, m.
491 |
492 |
493 |
494 |
495 | #### Параметры
496 |
497 | * *modifier*: Устанавливаемый модификатор
498 |
499 | #### Возвращаемое значение
500 |
501 | ВербальноеВыражение
502 |
503 |
504 | ### УдалитьМодификатор / RemoveModifier()
505 |
506 |
507 |
508 | Удаление модификатора регулярного выражения.
509 | Допустимые значения: i, m.
510 |
511 |
512 |
513 |
514 | #### Параметры
515 |
516 | * *modifier*: Удаляемый модификатор
517 |
518 | #### Возвращаемое значение
519 |
520 | ВербальноеВыражение
521 |
522 |
523 | ### Добавить / Add()
524 |
525 |
526 |
527 | Добавление произвольного текста в регулярное выражение.
528 |
529 |
530 |
531 |
532 | #### Параметры
533 |
534 | * *value*: Добавляемый текст
535 |
536 | * *sanitize*: Экранировать переданное значение
537 |
538 | #### Возвращаемое значение
539 |
540 | ВербальноеВыражение
541 |
542 |
543 | ### Экранировать / Sanitize()
544 |
545 |
546 |
547 | Экранирование управляющих символов регулярного выражения в переданной строке.
548 |
549 |
550 |
551 |
552 | #### Параметры
553 |
554 | * *value*: Экранируемая строка
555 |
556 | #### Возвращаемое значение
557 |
558 | Экранированная строка
559 |
560 |
561 | ## Конструкторы
562 |
563 |
564 | ### По умолчанию
565 |
566 |
567 | Конструктор Вербального выражения.
568 |
569 |
570 |
571 |
572 |
--------------------------------------------------------------------------------
/oscript-component.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2012
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "oscript-component", "oscript-component\oscript-component.csproj", "{EA173D06-CCD2-45D5-A263-DC866289517A}"
5 | EndProject
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NUnitTests", "NUnitTests\NUnitTests.csproj", "{9A739C32-D551-43B0-920A-D9C53367BC38}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Release|Any CPU.Build.0 = Release|Any CPU
24 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
25 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Debug|Any CPU.Build.0 = Debug|Any CPU
26 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Release|Any CPU.ActiveCfg = Release|Any CPU
27 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Release|Any CPU.Build.0 = Release|Any CPU
28 | EndGlobalSection
29 | EndGlobal
30 |
--------------------------------------------------------------------------------
/oscript-component/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 |
4 | // Information about this assembly is defined by the following attributes.
5 | // Change them to the values specific to your project.
6 |
7 | [assembly: AssemblyTitle("oscript-verbal-expressions")]
8 | [assembly: AssemblyDescription("OneScript Verbal Expressions")]
9 | [assembly: AssemblyConfiguration("")]
10 | [assembly: AssemblyCompany("")]
11 | [assembly: AssemblyProduct("")]
12 | [assembly: AssemblyCopyright("nixel2007")]
13 | [assembly: AssemblyTrademark("")]
14 | [assembly: AssemblyCulture("")]
15 |
16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision,
18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision.
19 |
20 | [assembly: AssemblyVersion("1.0.*")]
21 |
22 | // The following attributes are used to specify the signing key for the assembly,
23 | // if desired. See the Mono documentation for more information about signing.
24 |
25 | //[assembly: AssemblyDelaySign(false)]
26 | //[assembly: AssemblyKeyFile("")]
27 |
28 |
--------------------------------------------------------------------------------
/oscript-component/VerbalExpression.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Reflection;
3 | using System.Text.RegularExpressions;
4 | using CSharpVerbalExpressions;
5 | using ScriptEngine.Machine.Contexts;
6 | using ScriptEngine.Machine;
7 |
8 | namespace OnescriptVerbalExpressions
9 | {
10 | ///
11 | /// Класс предоставляет объектную модель для построения регулярных выражений.
12 | ///
13 | [ContextClass("ВербальноеВыражение", "VerbalExpression")]
14 | public class VerbalExpression : AutoContext
15 | {
16 | private readonly VerbalExpressions _verbalExpression = new VerbalExpressions();
17 | private RegexOptions _modifiers = RegexOptions.IgnoreCase | RegexOptions.Multiline;
18 |
19 | #region Terminals
20 |
21 | ///
22 | /// Преобразует объект в РегулярноеВыражение.
23 | ///
24 | /// Объект РегулярноеВыражение с заполненным шаблоном поиска и флагами
25 | ///
26 | [ContextMethod("ВРегулярноеВыражение")]
27 | public IRuntimeContextInstance ToRegex()
28 | {
29 | var regexString = ToStringImpl();
30 | var oscriptRegExpType = Assembly.Load("ScriptEngine.HostedScript")
31 | .GetType("ScriptEngine.HostedScript.Library.Regex.RegExpImpl");
32 | var methodInfo = oscriptRegExpType.GetMethod("Constructor");
33 | if (methodInfo == null)
34 | {
35 | throw new TypeLoadException();
36 | }
37 |
38 | var oscriptRegExpImpl = (IRuntimeContextInstance) methodInfo.Invoke(
39 | null,
40 | new object[] {ValueFactory.Create(regexString)}
41 | );
42 |
43 | var propertyMultiline = oscriptRegExpImpl.FindProperty("Multiline");
44 | var valueMultiline = _modifiers.HasFlag(RegexOptions.Multiline);
45 | oscriptRegExpImpl.SetPropValue(propertyMultiline, ValueFactory.Create(valueMultiline));
46 |
47 | var propertyIgnoreCase = oscriptRegExpImpl.FindProperty("IgnoreCase");
48 | var valueIgnoreCase = _modifiers.HasFlag(RegexOptions.IgnoreCase);
49 | oscriptRegExpImpl.SetPropValue(propertyIgnoreCase, ValueFactory.Create(valueIgnoreCase));
50 |
51 | return oscriptRegExpImpl;
52 |
53 | }
54 |
55 | ///
56 | /// Преобразует объект в строку.
57 | ///
58 | /// Текст регулярного выражения в виде строки
59 | [ContextMethod("ВСтроку", "ToString")]
60 | public string ToStringImpl()
61 | {
62 | return _verbalExpression.ToString();
63 | }
64 |
65 | #endregion
66 |
67 | #region Modifiers
68 |
69 | ///
70 | /// Ищет в строке определенное значение. То же самое, что и `Затем()`.
71 | ///
72 | /// Искомое значение
73 | /// Экранировать переданное значение
74 | /// ВербальноеВыражение
75 | [ContextMethod("Найти")]
76 | public VerbalExpression Find(string value, bool sanitize = true)
77 | {
78 | return Then(value, sanitize);
79 | }
80 |
81 | ///
82 | /// Ищет в строке определенное значение. То же самое, что и `Найти()`.
83 | ///
84 | /// Искомое значение
85 | /// Экранировать переданное значение
86 | /// ВербальноеВыражение
87 | [ContextMethod("Затем")]
88 | public VerbalExpression Then(string value, bool sanitize = true)
89 | {
90 | _verbalExpression.Then(value, sanitize);
91 | return this;
92 | }
93 |
94 | ///
95 | /// Добавление условия ИЛИ в выражение.
96 | ///
97 | /// Искомое значение
98 | /// Экранировать переданное значение
99 | /// ВербальноеВыражение
100 | [ContextMethod("Либо")]
101 | public VerbalExpression Or(string value, bool sanitize = true)
102 | {
103 | _verbalExpression.Or(value, sanitize);
104 | return this;
105 | }
106 |
107 | ///
108 | /// Поиск "чего угодно", в том числе отсутствия символов.
109 | ///
110 | /// ВербальноеВыражение
111 | [ContextMethod("ЧтоУгодно")]
112 | public VerbalExpression Anything()
113 | {
114 | _verbalExpression.Anything();
115 | return this;
116 | }
117 |
118 | ///
119 | /// Поиск "чего угодно, кроме" указанных символов, в том числе их отсутствие.
120 | ///
121 | /// Искомое значение
122 | /// Экранировать переданное значение
123 | /// ВербальноеВыражение
124 | [ContextMethod("ЧтоУгодноНоНе")]
125 | public VerbalExpression AnythingBut(string value, bool sanitize = true)
126 | {
127 | _verbalExpression.AnythingBut(value, sanitize);
128 | return this;
129 | }
130 |
131 | ///
132 | /// Поиск "чего-нибудь" - любого символа хотя бы один раз.
133 | ///
134 | /// ВербальноеВыражение
135 | [ContextMethod("ЧтоНибудь")]
136 | public VerbalExpression Something()
137 | {
138 | _verbalExpression.Something();
139 | return this;
140 | }
141 |
142 | ///
143 | /// Поиск "чего-нибудь, кроме" указанных символов хотя бы один раз.
144 | ///
145 | /// Искомое значение
146 | /// Экранировать переданное значение
147 | /// ВербальноеВыражение
148 | [ContextMethod("ЧтоНибудьНоНе")]
149 | public VerbalExpression SomethingBut(string value, bool sanitize = true)
150 | {
151 | _verbalExpression.SomethingBut(value, sanitize);
152 | return this;
153 | }
154 |
155 | ///
156 | /// Поиск необязательного значения.
157 | ///
158 | /// Искомое значение
159 | /// Экранировать переданное значение
160 | /// ВербальноеВыражение
161 | [ContextMethod("МожетБыть")]
162 | public VerbalExpression Maybe(string value, bool sanitize = true)
163 | {
164 | _verbalExpression.Maybe(value, sanitize);
165 | return this;
166 | }
167 |
168 | ///
169 | /// Добавляет в поиск префикс "начала строки".
170 | ///
171 | /// ВербальноеВыражение
172 | [ContextMethod("НачалоСтроки")]
173 | public VerbalExpression StartOfLine()
174 | {
175 | _verbalExpression.StartOfLine();
176 | return this;
177 | }
178 |
179 | ///
180 | /// Добавляет в поиск суффикс "конца строки".
181 | ///
182 | /// ВербальноеВыражение
183 | [ContextMethod("КонецСтроки")]
184 | public VerbalExpression EndOfLine()
185 | {
186 | _verbalExpression.EndOfLine();
187 | return this;
188 | }
189 |
190 | #endregion
191 |
192 | #region Special characters and groups
193 |
194 | ///
195 | /// Перевод строки.
196 | ///
197 | /// ВербальноеВыражение
198 | [ContextMethod("ПереводСтроки")]
199 | public VerbalExpression LineBreak()
200 | {
201 | _verbalExpression.LineBreak();
202 | return this;
203 | }
204 |
205 | ///
206 | /// Перевод строки.
207 | ///
208 | /// ВербальноеВыражение
209 | [ContextMethod("ПС")]
210 | public VerbalExpression LF()
211 | {
212 | _verbalExpression.Br();
213 | return this;
214 | }
215 |
216 | ///
217 | /// Символ табуляции.
218 | ///
219 | /// ВербальноеВыражение
220 | [ContextMethod("Отступ")]
221 | public VerbalExpression Tab()
222 | {
223 | _verbalExpression.Tab();
224 | return this;
225 | }
226 |
227 | ///
228 | /// Буквенно-цифровая последовательность символов.
229 | ///
230 | /// ВербальноеВыражение
231 | [ContextMethod("Слово")]
232 | public VerbalExpression Word()
233 | {
234 | _verbalExpression.Word();
235 | return this;
236 | }
237 |
238 | ///
239 | /// Любое число.
240 | ///
241 | /// ВербальноеВыражение
242 | [ContextMethod("Число")]
243 | public VerbalExpression Digit()
244 | {
245 | _verbalExpression.Add("\\d", false);
246 | return this;
247 | }
248 |
249 | ///
250 | /// Любой пробельный символ.
251 | ///
252 | /// ВербальноеВыражение
253 | [ContextMethod("ПробельныйСимвол")]
254 | public VerbalExpression Whitespace()
255 | {
256 | _verbalExpression.Add("\\s", false);
257 | return this;
258 | }
259 |
260 | ///
261 | /// Диапазон символов.
262 | ///
263 | /// Нижняя граница диапазона
264 | /// Верхняя граница диапазона
265 | /// ВербальноеВыражение
266 | [ContextMethod("Диапазон")]
267 | public VerbalExpression Range(string from, string to)
268 | {
269 | _verbalExpression.Range(from, to);
270 | return this;
271 | }
272 |
273 | ///
274 | /// Любой из указанных символов. То же самое, что и `ЛюбойИз()`
275 | ///
276 | /// Искомое значение
277 | /// ВербальноеВыражение
278 | [ContextMethod("Любой")]
279 | public VerbalExpression Any(string value)
280 | {
281 | _verbalExpression.Any(value);
282 | return this;
283 | }
284 |
285 | ///
286 | /// Любой из указанных символов. То же самое, что и `Любой()`
287 | ///
288 | /// Искомое значение
289 | /// ВербальноеВыражение
290 | [ContextMethod("ЛюбойИз")]
291 | public VerbalExpression AnyOf(string value)
292 | {
293 | _verbalExpression.AnyOf(value);
294 | return this;
295 | }
296 |
297 | ///
298 | /// Поиск "одного или более".
299 | /// Если передан параметр `value`, то мультипликатор применяется к нему.
300 | /// Если параметр `value` не передан, то мультипликатор применяется к предыдущей группе регулярного выражения.
301 | ///
302 | /// Искомое значение
303 | /// Экранировать переданное значение
304 | /// ВербальноеВыражение
305 | [ContextMethod("ОдинИлиБольше")]
306 | public VerbalExpression OneOrMore(string value = "", bool sanitize = true)
307 | {
308 | if (string.IsNullOrEmpty(value))
309 | {
310 | _verbalExpression.Add("+", false);
311 | }
312 | else
313 | {
314 | _verbalExpression.Multiple(value, sanitize);
315 | }
316 | return this;
317 | }
318 |
319 | ///
320 | /// Начать захват группы.
321 | ///
322 | /// Имя группы
323 | /// ВербальноеВыражение
324 | [ContextMethod("НачатьЗахват")]
325 | public VerbalExpression BeginCapture(string groupName = "")
326 | {
327 | if (string.IsNullOrEmpty(groupName))
328 | {
329 | _verbalExpression.BeginCapture();
330 | }
331 | else
332 | {
333 | _verbalExpression.BeginCapture(groupName);
334 | }
335 | return this;
336 | }
337 |
338 | ///
339 | /// Закончить захват группы.
340 | ///
341 | /// ВербальноеВыражение
342 | [ContextMethod("ЗакончитьЗахват")]
343 | public VerbalExpression EndCapture()
344 | {
345 | _verbalExpression.EndCapture();
346 | return this;
347 | }
348 |
349 | ///
350 | /// Повторить предыдущую группу поиска n раз.
351 | ///
352 | /// Число повторений
353 | /// ВербальноеВыражение
354 | [ContextMethod("ПовторитьПредыдущее")]
355 | public VerbalExpression RepeatPrevious(int n)
356 | {
357 | _verbalExpression.RepeatPrevious(n);
358 | return this;
359 | }
360 |
361 | ///
362 | /// Повторить предыдущую группу поиска от n до m раз.
363 | ///
364 | /// Нижняя гранница
365 | /// Верхняя граница
366 | /// ВербальноеВыражение
367 | [ContextMethod("ПовторитьПредыдущееОтИДо")]
368 | public VerbalExpression RepeatPreviousFromAndTo(int n, int m)
369 | {
370 | _verbalExpression.RepeatPrevious(n, m);
371 | return this;
372 | }
373 |
374 | #endregion
375 |
376 | #region RegExp options
377 |
378 | ///
379 | /// Включить поиск без учета регистра символов.
380 | ///
381 | /// Флаг включения/выключения поиска
382 | /// ВербальноеВыражение
383 | [ContextMethod("СЛюбымРегистром")]
384 | public VerbalExpression WithAnyCase(bool enable)
385 | {
386 | if (enable)
387 | {
388 | AddModifier("i");
389 | }
390 | else
391 | {
392 | RemoveModifier("i");
393 | }
394 | _verbalExpression.WithAnyCase(enable);
395 | return this;
396 | }
397 |
398 | ///
399 | /// Включить поиск только по одной строке.
400 | ///
401 | /// Флаг включения/выключения поиска
402 | /// ВербальноеВыражение
403 | [ContextMethod("ОднострочныйПоиск")]
404 | public VerbalExpression SearchOneLine(bool enable)
405 | {
406 | if (enable)
407 | {
408 | RemoveModifier("m");
409 | }
410 | else
411 | {
412 | AddModifier("m");
413 | }
414 | _verbalExpression.UseOneLineSearchOption(enable);
415 | return this;
416 | }
417 |
418 | ///
419 | /// Добавление модификатора регулярного выражения.
420 | /// Допустимые значения: i, m.
421 | ///
422 | /// Устанавливаемый модификатор
423 | /// ВербальноеВыражение
424 | [ContextMethod("ДобавитьМодификатор")]
425 | public VerbalExpression AddModifier(string modifier)
426 | {
427 | switch (modifier)
428 | {
429 | case "i":
430 | _modifiers |= RegexOptions.IgnoreCase;
431 | break;
432 | case "m":
433 | _modifiers |= RegexOptions.Multiline;
434 | break;
435 | case "s":
436 | _modifiers |= RegexOptions.Singleline;
437 | break;
438 | case "x":
439 | _modifiers |= RegexOptions.IgnorePatternWhitespace;
440 | break;
441 | }
442 |
443 | _verbalExpression.AddModifier(modifier.ToCharArray(0, 1)[0]);
444 | return this;
445 | }
446 |
447 | ///
448 | /// Удаление модификатора регулярного выражения.
449 | /// Допустимые значения: i, m.
450 | ///
451 | /// Удаляемый модификатор
452 | /// ВербальноеВыражение
453 | [ContextMethod("УдалитьМодификатор")]
454 | public VerbalExpression RemoveModifier(string modifier)
455 | {
456 | switch (modifier)
457 | {
458 | case "i":
459 | _modifiers &= ~RegexOptions.IgnoreCase;
460 | break;
461 | case "m":
462 | _modifiers &= ~RegexOptions.Multiline;
463 | break;
464 | case "s":
465 | _modifiers &= ~RegexOptions.Singleline;
466 | break;
467 | case "x":
468 | _modifiers &= ~RegexOptions.IgnorePatternWhitespace;
469 | break;
470 | }
471 |
472 | _verbalExpression.RemoveModifier(modifier.ToCharArray(0, 1)[0]);
473 | return this;
474 | }
475 | #endregion
476 |
477 | #region Other
478 |
479 | ///
480 | /// Добавление произвольного текста в регулярное выражение.
481 | ///
482 | /// Добавляемый текст
483 | /// Экранировать переданное значение
484 | /// ВербальноеВыражение
485 | [ContextMethod("Добавить")]
486 | public VerbalExpression Add(string value, bool sanitize = true)
487 | {
488 | _verbalExpression.Add(value, sanitize);
489 | return this;
490 | }
491 |
492 | ///
493 | /// Экранирование управляющих символов регулярного выражения в переданной строке.
494 | ///
495 | /// Экранируемая строка
496 | /// Экранированная строка
497 | [ContextMethod("Экранировать")]
498 | public string Sanitize(string value)
499 | {
500 | return _verbalExpression.Sanitize(value);
501 | }
502 |
503 | #endregion
504 |
505 | ///
506 | /// Конструктор Вербального выражения.
507 | ///
508 | /// ВербальноеВыражение
509 | [ScriptConstructor]
510 | public static VerbalExpression Constructor()
511 | {
512 | return new VerbalExpression();
513 | }
514 | }
515 | }
516 |
517 |
--------------------------------------------------------------------------------
/oscript-component/oscript-component.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {EA173D06-CCD2-45D5-A263-DC866289517A}
7 | Library
8 | oscriptcomponent
9 | oscript-component
10 | v4.5
11 |
12 |
13 | true
14 | full
15 | false
16 | bin\Debug
17 | DEBUG;
18 | prompt
19 | 4
20 | bin\Debug\oscript-component.xml
21 | false
22 |
23 |
24 | full
25 | true
26 | bin\Release
27 | prompt
28 | 4
29 | bin\Debug\oscript-component.xml
30 | false
31 |
32 |
33 |
34 |
35 | ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll
36 |
37 |
38 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll
39 |
40 |
41 | ..\packages\OneScript.1.0.16\lib\net40\ScriptEngine.dll
42 |
43 |
44 | ..\packages\OneScript.StandardLibrary.1.0.16\lib\net40\ScriptEngine.HostedScript.dll
45 |
46 |
47 | ..\packages\VerbalExpressions-official.0.1.0\lib\net40\VerbalExpressions.dll
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/oscript-component/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/package-loader.os:
--------------------------------------------------------------------------------
1 | Процедура ПриЗагрузкеБиблиотеки(Знач КаталогБиблиотеки, СтандартнаяОбработка, Отказ)
2 |
3 | СтандартнаяОбработка = Ложь;
4 | Отказ = Ложь;
5 |
6 | // Тут нужно подключать каждую библиотеку.
7 | // Желательно в порядке разрешения зависимостей:
8 | // чтобы зависимость была загружена ранее зависимой библиотеки
9 |
10 | ПодключитьВнешнююКомпоненту(ОбъединитьПути(КаталогБиблиотеки, "bin", "oscript-component.dll"));
11 |
12 | КонецПроцедуры
13 |
14 |
--------------------------------------------------------------------------------
/packagedef:
--------------------------------------------------------------------------------
1 | Описание
2 | .Имя("verbal-expressions")
3 | .Версия("1.0.0")
4 | .Автор("Nikita Gryzlov")
5 | .АдресАвтора("nixel2007@gmail.com")
6 | .Описание("Регулярные выражения - это просто!")
7 |
8 | .ВерсияСреды("1.0.16")
9 |
10 | .ВключитьФайл("lib.config")
11 | // Сюда будут складываться компоненты (см. appveyor.yml)
12 | .ВключитьФайл("bin")
13 | // Это файл автозагрузки, который подгружает компоненты из библиотеки
14 | .ВключитьФайл("package-loader.os")
15 |
16 | .ВключитьФайл("README.md")
17 | ;
18 |
19 | // vim: filetype=onescript
20 |
--------------------------------------------------------------------------------
/testcomponent.os:
--------------------------------------------------------------------------------
1 | ПодключитьВнешнююКомпоненту("oscript-component/bin/Debug/oscript-component.dll");
2 |
3 | Слагаемое1 = Новый Слагаемое(5);
4 | Слагаемое2 = Новый Слагаемое(Слагаемое1);
5 |
6 | Сообщить("Слагаемое1 = " + Слагаемое1);
7 | Сообщить("Слагаемое2 = " + Слагаемое2);
8 |
9 | Складыватель = Новый Сложение;
10 | Складыватель.ДобавитьСлагаемое(Слагаемое1);
11 | Складыватель.ДобавитьСлагаемое(Слагаемое2);
12 | Складыватель.ДобавитьСлагаемое(8);
13 |
14 | Сумма = Складыватель.Вычислить();
15 |
16 | Сообщить("Получилось: " + Сумма);
17 |
18 | Складыватель2 = Новый Сложение(1, 2);
19 | Сообщить("Конструктор 2: " + Складыватель2.Вычислить());
20 |
21 | Складыватель3 = Новый Сложение(Складыватель);
22 | Сообщить("Конструктор 3: " + Складыватель3.Вычислить());
23 |
--------------------------------------------------------------------------------