diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 6a56b37b8..000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "oscript-library"] - path = oscript-library - url = https://github.com/EvilBeaver/oscript-library.git - branch = master diff --git a/BuildAll.csproj b/BuildAll.csproj index ce6a04716..025c7304c 100644 --- a/BuildAll.csproj +++ b/BuildAll.csproj @@ -7,7 +7,7 @@ $(OutputPathForBuild)\bin\ $(OutputPathForBuild)\lib\ $(OutputPathForBuild)\doc\ - $(OutputPathForBuild)\vscode\ + $(OutputPathForBuild)\vscode\ $(MSBuildProjectDirectory)\mddoc $(OutputPathForBuild)\examples\ $(MSBuildProjectDirectory)\src\1Script.sln @@ -104,27 +104,32 @@ - - + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -136,28 +141,48 @@ + - - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Jenkinsfile b/Jenkinsfile index 9c323b724..e2bafd522 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -4,7 +4,7 @@ pipeline { agent none environment { - ReleaseNumber = 18 + ReleaseNumber = 19 outputEnc = '65001' } @@ -17,6 +17,7 @@ pipeline { environment { NugetPath = "${tool 'nuget'}" OneScriptDocumenter = "${tool 'documenter'}" + StandardLibraryPacks = "${tool 'os_stdlib'}" } steps { @@ -27,14 +28,56 @@ pipeline { // // Поэтому, применяем костыль с кастомным workspace // см. https://issues.jenkins-ci.org/browse/JENKINS-34564 + // + // А еще Jenkins под Windows постоянно добавляет в конец папки какую-то мусорную строку. + // Для этого отсекаем все, что находится после последнего дефиса + // см. https://issues.jenkins-ci.org/browse/JENKINS-40072 - ws("$workspace".replaceAll("%", "_")) + ws(env.WORKSPACE.replaceAll("%", "_").replaceAll(/(-[^-]+$)/, "")) { - checkout scm + step([$class: 'WsCleanup']) + checkout scm bat 'set' - bat "chcp $outputEnc > nul\r\n\"${tool 'MSBuild'}\" BuildAll.csproj /p:Configuration=Release /p:Platform=x86 /t:Build" - + withSonarQubeEnv('silverbulleters') { + script { + def sqScannerMsBuildHome = tool 'sonar-scanner for msbuild'; + sqScannerMsBuildHome = sqScannerMsBuildHome + "\\SonarQube.Scanner.MSBuild.exe"; + def sonarcommandStart = "@" + sqScannerMsBuildHome + " begin /k:1script /n:OneScript /v:\"1.0.${env.ReleaseNumber}\""; + def makeAnalyzis = true + if (env.BRANCH_NAME == "develop") { + echo 'Analysing develop branch' + } else if (env.BRANCH_NAME.startsWith("PR-")) { + // Report PR issues + def PRNumber = env.BRANCH_NAME.tokenize("PR-")[0] + def gitURLcommand = 'git config --local remote.origin.url' + def gitURL = "" + + if (isUnix()) { + gitURL = sh(returnStdout: true, script: gitURLcommand).trim() + } else { + gitURL = bat(returnStdout: true, script: gitURLcommand).trim() + } + + def repository = gitURL.tokenize("/")[2] + "/" + gitURL.tokenize("/")[3] + repository = repository.tokenize(".")[0] + withCredentials([string(credentialsId: 'GithubOAUTHToken_ForSonar', variable: 'githubOAuth')]) { + sonarcommandStart = sonarcommandStart + " /d:sonar.analysis.mode=issues /d:sonar.github.pullRequest=${PRNumber} /d:sonar.github.repository=${repository} /d:sonar.github.oauth=${githubOAuth}" + } + } else { + makeAnalyzis = false + } + + if (makeAnalyzis) { + bat "${sonarcommandStart}" + } + bat "chcp $outputEnc > nul\r\n\"${tool 'MSBuild'}\" BuildAll.csproj /p:Configuration=Release /p:Platform=x86 /t:Build" + if (makeAnalyzis) { + bat "${sqScannerMsBuildHome} end" + } + } + } + stash includes: 'tests, install/build/**, mddoc/**', name: 'buildResults' } } @@ -65,12 +108,12 @@ pipeline { agent { label 'windows' } steps { - ws("$workspace".replaceAll("%", "_")) + ws(env.WORKSPACE.replaceAll("%", "_").replaceAll(/(-[^-]+$)/, "")) { dir('install/build'){ - deleteDir() - } - unstash 'buildResults' + deleteDir() + } + unstash 'buildResults' bat "chcp $outputEnc > nul\r\n\"${tool 'MSBuild'}\" BuildAll.csproj /p:Configuration=Release /p:Platform=x86 /t:xUnitTest" junit 'tests/tests.xml' @@ -84,11 +127,11 @@ pipeline { steps { - dir('install/build'){ - deleteDir() - } - - unstash 'buildResults' + dir('install/build'){ + deleteDir() + } + + unstash 'buildResults' sh '''\ if [ ! -d lintests ]; then @@ -118,12 +161,17 @@ pipeline { } steps { - ws("$workspace".replaceAll("%", "_")) + ws(env.WORKSPACE.replaceAll("%", "_").replaceAll(/(-[^-]+$)/, "")) { dir('install/build'){ - deleteDir() - } - unstash 'buildResults' + deleteDir() + } + + dir('dist'){ + deleteDir() + } + + unstash 'buildResults' //unstash 'sitedoc' bat "chcp $outputEnc > nul\r\n\"${tool 'MSBuild'}\" BuildAll.csproj /p:Configuration=Release /p:Platform=x86 /t:CreateZip;CreateInstall;CreateNuget" archiveArtifacts artifacts: '**/dist/*.exe, **/dist/*.msi, **/dist/*.zip, **/dist/*.nupkg', fingerprint: true @@ -138,9 +186,9 @@ pipeline { steps { dir('install/build'){ - deleteDir() - } - checkout scm + deleteDir() + } + checkout scm unstash 'buildResults' sh ''' @@ -174,26 +222,36 @@ pipeline { agent { label 'master' } steps { + unstash 'winDist' unstash 'linDist' unstash 'vsix' sh ''' + if [ -d "targetContent" ]; then + rm -rf targetContent + fi + mkdir targetContent + mv dist/* targetContent/ + mv output/*.rpm targetContent/ + mv install/build/vscode/*.vsix targetContent/ + TARGET="/var/www/oscript.io/download/versions/night-build/" - sudo rsync -rv --delete --exclude mddoc*.zip dist/* $TARGET - sudo rsync -rv --delete --exclude *.src.rpm output/* $TARGET - sudo rsync -rv --delete install/build/vscode/*.vsix $TARGET - + + cd targetContent + sudo rsync -rv --delete --exclude mddoc*.zip --exclude *.src.rpm . $TARGET + rm -rf targetContent '''.stripIndent() } } - - stage ('Publishing master') { + + stage ('Publishing master') { when { branch 'master' } - + agent { label 'master' } steps { + unstash 'winDist' unstash 'linDist' unstash 'vsix' diff --git a/install/builders/rpm/oscript.spec b/install/builders/rpm/oscript.spec index 4151aa67e..1e8a5629a 100644 --- a/install/builders/rpm/oscript.spec +++ b/install/builders/rpm/oscript.spec @@ -11,6 +11,7 @@ Source0: OneScript-%{version}.tar.gz BuildArch: noarch BuildRequires: wget Requires: mono-core +Requires: mono-locale-extras %define _empty_manifest_terminate_build 0 %define _subdir OneScript-%{version} diff --git a/install/install.iss b/install/install.iss index f6f457c46..e33c92580 100644 --- a/install/install.iss +++ b/install/install.iss @@ -32,6 +32,7 @@ Name: "custom"; Description: "Выборочная установка"; Flags: i [Components] Name: "main"; Description: "Основные файлы"; Types: normal custom; Flags: fixed +Name: "isapi"; Description: "Обработчик HTTP-сервисов"; Types: normal custom; Name: "stdlib"; Description: "Стандартная библиотека скриптов"; Types: normal custom; Name: "testapp"; Description: "Тестовая консоль (TestApp)"; Name: "docs"; Description: "Документация по свойствам и методам (синтакс-помощник)"; @@ -47,6 +48,9 @@ Source: "build\bin\oscript.cfg"; DestDir: "{app}\bin"; Components: main; Flags: Source: "build\examples\*"; DestDir: "{app}\examples"; Components: main +;isapi +Source: "build\bin\ASPNETHandler.dll"; DestDir: "{app}\bin"; Components: isapi; + ; testapp Source: "build\bin\TestApp.exe"; DestDir: "{app}\bin"; Components: testapp Source: "build\bin\ICSharpCode.AvalonEdit.dll"; DestDir: "{app}\bin"; Components: testapp diff --git a/install/opm-0.13.0.ospx b/install/opm-0.13.0.ospx new file mode 100644 index 000000000..8a069a7fd Binary files /dev/null and b/install/opm-0.13.0.ospx differ diff --git a/install/package-loader.os b/install/package-loader.os new file mode 100644 index 000000000..89a87329c --- /dev/null +++ b/install/package-loader.os @@ -0,0 +1,228 @@ +// Пояснения по переменным даны в конце модуля +Перем ПоказатьСообщенияЗагрузки; +Перем ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей; + +Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ) + Вывести(" + |ПриЗагрузкеБиблиотеки " + Путь); + + ФайлМанифеста = Новый Файл(ОбъединитьПути(Путь, "lib.config")); + + Если ФайлМанифеста.Существует() Тогда + Вывести("Обрабатываем по манифесту"); + + СтандартнаяОбработка = Ложь; + ОбработатьМанифест(ФайлМанифеста.ПолноеИмя, Путь, Отказ); + Иначе + Вывести("Обрабатываем структуру каталогов по соглашению"); + ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьМанифест(Знач Файл, Знач Путь, Отказ) + + Чтение = Новый ЧтениеXML; + Чтение.ОткрытьФайл(Файл); + Чтение.ПерейтиКСодержимому(); + + Если Чтение.ЛокальноеИмя <> "package-def" Тогда + Отказ = Истина; + Чтение.Закрыть(); + Возврат; + КонецЕсли; + + Пока Чтение.Прочитать() Цикл + + Если Чтение.ТипУзла = ТипУзлаXML.Комментарий Тогда + + Продолжить; + + КонецЕсли; + + Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + Если Чтение.ЛокальноеИмя = "class" Тогда + ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file")); + Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда + Идентификатор = Чтение.ЗначениеАтрибута("name"); + Если Не ПустаяСтрока(Идентификатор) Тогда + Вывести(СтрШаблон(" класс %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя)); + + // ДобавитьКласс(ФайлКласса.ПолноеИмя, Идентификатор); + ДобавитьКлассЕслиРанееНеДобавляли(ФайлКласса.ПолноеИмя, Идентификатор); + КонецЕсли; + Иначе + ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте"; + КонецЕсли; + + Чтение.Прочитать(); // в конец элемента + КонецЕсли; + + Если Чтение.ЛокальноеИмя = "module" Тогда + ФайлКласса = Новый Файл(Путь + "/" + Чтение.ЗначениеАтрибута("file")); + Если ФайлКласса.Существует() и ФайлКласса.ЭтоФайл() Тогда + Идентификатор = Чтение.ЗначениеАтрибута("name"); + Если Не ПустаяСтрока(Идентификатор) Тогда + Вывести(СтрШаблон(" модуль %1, файл %2", Идентификатор, ФайлКласса.ПолноеИмя)); + Попытка + ДобавитьМодуль(ФайлКласса.ПолноеИмя, Идентификатор); + Исключение + Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда + ВызватьИсключение; + КонецЕсли; + Вывести("Предупреждение: + | " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + КонецЕсли; + Иначе + ВызватьИсключение "Не найден файл " + ФайлКласса.ПолноеИмя + ", указанный в манифесте"; + КонецЕсли; + + Чтение.Прочитать(); // в конец элемента + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Чтение.Закрыть(); + +КонецПроцедуры + +Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ) + + КаталогиКлассов = Новый Массив; + КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Классы")); + КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Classes")); + КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Классы")); + КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Classes")); + + КаталогиМодулей = Новый Массив; + КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Модули")); + КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Modules")); + КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Модули")); + КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Modules")); + + + Для Каждого мКаталог Из КаталогиКлассов Цикл + + ОбработатьКаталогКлассов(мКаталог, СтандартнаяОбработка, Отказ); + + КонецЦикла; + + Для Каждого мКаталог Из КаталогиМодулей Цикл + + ОбработатьКаталогМодулей(мКаталог, СтандартнаяОбработка, Отказ); + + КонецЦикла; + +КонецПроцедуры + +Процедура ОбработатьКаталогКлассов(Знач Путь, СтандартнаяОбработка, Отказ) + + КаталогКлассов = Новый Файл(Путь); + + Если КаталогКлассов.Существует() Тогда + Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os"); + Для Каждого Файл Из Файлы Цикл + Вывести(СтрШаблон(" класс (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя)); + СтандартнаяОбработка = Ложь; + // ДобавитьКласс(Файл.ПолноеИмя, Файл.ИмяБезРасширения); + ДобавитьКлассЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьКаталогМодулей(Знач Путь, СтандартнаяОбработка, Отказ) + + КаталогМодулей = Новый Файл(Путь); + + Если КаталогМодулей.Существует() Тогда + Файлы = НайтиФайлы(КаталогМодулей.ПолноеИмя, "*.os"); + Для Каждого Файл Из Файлы Цикл + Вывести(СтрШаблон(" модуль (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя)); + СтандартнаяОбработка = Ложь; + Попытка + ДобавитьМодуль(Файл.ПолноеИмя, Файл.ИмяБезРасширения); + Исключение + Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда + ВызватьИсключение; + КонецЕсли; + СтандартнаяОбработка = Истина; + Вывести("Предупреждение: + |" + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса) + Вывести("Добавляю класс, если ранее не добавляли " + ИмяКласса); + Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда + Вывести("Добавляю класс " + ИмяКласса); + ДобавитьКласс(ПутьФайла, ИмяКласса); + Возврат; + КонецЕсли; + + КлассУжеЕсть = Ложь; + Попытка + Объект = Новый(ИмяКласса); + КлассУжеЕсть = Истина; + Исключение + СообщениеОшибки = ОписаниеОшибки(); + ИскомаяОшибка = СтрШаблон("Конструктор не найден (%1)", ИмяКласса); + КлассУжеЕсть = СтрНайти(СообщениеОшибки, ИскомаяОшибка) = 0; + КонецПопытки; + Если Не КлассУжеЕсть Тогда + + Вывести("Добавляю класс, т.к. он не найден - " + ИмяКласса); + ДобавитьКласс(ПутьФайла, ИмяКласса); + + Иначе + Вывести("Пропускаю загрузку класса " + ИмяКласса); + + КонецЕсли; +КонецПроцедуры + +Процедура Вывести(Знач Сообщение) + Если ПоказатьСообщенияЗагрузки Тогда + Сообщить(Сообщение); + КонецЕсли; +КонецПроцедуры + +Функция ПолучитьБулевоИзПеременнойСреды(Знач ИмяПеременнойСреды, Знач ЗначениеПоУмолчанию) + Рез = ЗначениеПоУмолчанию; + РезИзСреды = ПолучитьПеременнуюСреды(ИмяПеременнойСреды); + Если ЗначениеЗаполнено(РезИзСреды) Тогда + РезИзСреды = СокрЛП(РезИзСреды); + Попытка + Рез = Число(РезИзСреды) <> 0 ; + Исключение + Рез = ЗначениеПоУмолчанию; + Сообщить(СтрШаблон("Неверный формат переменной среды %1. Ожидали 1 или 0, а получили %2", ИмяПеременнойСреды, РезИзСреды)); + КонецПопытки; + КонецЕсли; + + Возврат Рез; +КонецФункции + +// Если Истина, то выдаются подробные сообщения о порядке загрузке пакетов, классов, модулей, что помогает при анализе проблем +// очень полезно при анализе ошибок загрузки +// Переменная среды может принимать значение 0 (выключено) или 1 (включено) +// Значение флага по умолчанию - Ложь +ПоказатьСообщенияЗагрузки = ПолучитьБулевоИзПеременнойСреды( + "OSLIB_LOADER_TRACE", Ложь); + +// Если Ложь, то пропускаются ошибки повторной загрузки классов/модулей, +//что важно при разработке/тестировании стандартных библиотек +// Если Истина, то выдается ошибка при повторной загрузке классов библиотек из движка +// Переменная среды может принимать значение 0 (выключено) или 1 (включено) +// Значение флага по умолчанию - Истина +ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей = ПолучитьБулевоИзПеременнойСреды( + "OSLIB_LOADER_DUPLICATES", Ложь); + +// для установки других значений переменных среды и запуска скриптов можно юзать следующую командную строку +// (set OSLIB_LOADER_TRACE=1) && (oscript .\tasks\test.os) \ No newline at end of file diff --git a/oscript-library b/oscript-library deleted file mode 160000 index 99175103f..000000000 --- a/oscript-library +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 99175103f0f537cd7e12f2f58da5d8bc2a8de28e diff --git a/src/1Script.sln b/src/1Script.sln index 35d8f1f97..c72cc5152 100644 --- a/src/1Script.sln +++ b/src/1Script.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.12 +VisualStudioVersion = 15.0.27004.2006 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{4585BA5D-9EC4-4C89-8250-2033D2AC2999}" ProjectSection(ProjectDependencies) = postProject @@ -45,6 +45,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "oscriptTests", "oscriptTest EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{91059C5B-526C-4B81-B106-99DEFF542D1F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HTTPServices", "ASPNETHandler\HTTPServices.csproj", "{B7CD7F52-E387-490E-8F77-E1FB060401B5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestWebApp", "TestWebApp\TestWebApp.csproj", "{6DE97986-8304-45AE-BD47-63A5563F9C3A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -132,11 +136,23 @@ Global {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Debug|Any CPU.Build.0 = Debug|Any CPU {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Debug|x86.ActiveCfg = Debug|Any CPU - {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Debug|x86.Build.0 = Debug|Any CPU {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Release|Any CPU.ActiveCfg = Release|Any CPU {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Release|Any CPU.Build.0 = Release|Any CPU {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Release|x86.ActiveCfg = Release|Any CPU - {69A7869C-203C-4F09-AC3F-04E9B52AD7AB}.Release|x86.Build.0 = Release|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Debug|x86.ActiveCfg = Debug|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Debug|x86.Build.0 = Debug|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Release|Any CPU.Build.0 = Release|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Release|x86.ActiveCfg = Release|Any CPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5}.Release|x86.Build.0 = Release|Any CPU + {6DE97986-8304-45AE-BD47-63A5563F9C3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6DE97986-8304-45AE-BD47-63A5563F9C3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6DE97986-8304-45AE-BD47-63A5563F9C3A}.Debug|x86.ActiveCfg = Debug|Any CPU + {6DE97986-8304-45AE-BD47-63A5563F9C3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6DE97986-8304-45AE-BD47-63A5563F9C3A}.Release|Any CPU.Build.0 = Release|Any CPU + {6DE97986-8304-45AE-BD47-63A5563F9C3A}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/1Script.sln.DotSettings b/src/1Script.sln.DotSettings index c8aec44bd..26483e24e 100644 --- a/src/1Script.sln.DotSettings +++ b/src/1Script.sln.DotSettings @@ -21,6 +21,7 @@ 1 1 1 + NEVER True CHOP_ALWAYS False @@ -207,7 +208,12 @@ <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /> <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /> + True + True + True + True True True + True True True \ No newline at end of file diff --git a/src/ASPNETHandler/ASPNETHandler.cs b/src/ASPNETHandler/ASPNETHandler.cs new file mode 100644 index 000000000..637dd4536 --- /dev/null +++ b/src/ASPNETHandler/ASPNETHandler.cs @@ -0,0 +1,164 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Runtime.Caching; +using System.IO; + +using ScriptEngine; +using ScriptEngine.Machine; +using ScriptEngine.Environment; +using ScriptEngine.HostedScript; + +namespace OneScript.ASPNETHandler +{ + public class ASPNETHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState + { + HostedScriptEngine _hostedScript; + // Разрешает или запрещает кэширование исходников *.os В Linux должно быть false иначе после изменений исходника старая версия будет в кэше + // web.config -> -> + static bool _cachingEnabled; + // Список дополнительных сборок, которые надо приаттачить к движку. Могут быть разные расширения + // web.config -> -> Сделано так для простоты. Меньше настроек - дольше жизнь :) + static System.Collections.Generic.List _assembliesForAttaching; + + public bool IsReusable + { + // Разрешаем повторное использование и храним среду выполнения и контекст + get { return true; } + } + static ASPNETHandler() + { + _assembliesForAttaching = new List(); + + System.Collections.Specialized.NameValueCollection appSettings = System.Web.Configuration.WebConfigurationManager.AppSettings; + + _cachingEnabled = (appSettings["cachingEnabled"] == "true"); + + foreach (string assemblyName in appSettings.AllKeys) + { + if (appSettings[assemblyName] == "attachAssembly") + { + try + { + _assembliesForAttaching.Add(System.Reflection.Assembly.Load(assemblyName)); + } + catch {/*не загрузилась, ничего не делаем*/ } + } + } + } + + public ASPNETHandler() + { + _hostedScript = new HostedScriptEngine(); + _hostedScript.Initialize(); + _hostedScript.AttachAssembly(System.Reflection.Assembly.GetExecutingAssembly()); + // Аттачим доп сборки. По идее должны лежать в Bin + foreach (System.Reflection.Assembly assembly in _assembliesForAttaching) + { + try + { + _hostedScript.AttachAssembly(assembly); + } + catch { /*что-то не так, ничего не делаем*/} + } + } + + public void ProcessRequest(HttpContext context) + { + + #region Загружаем скрипт (файл .os) + // Кэшируем исходный файл, если файл изменился (изменили скрипт .os) загружаем заново + // Как это сделать с откомпилированным кодом, чтобы не компилировать? + // В Linux под Mono не работает подписка на изменение файла. + string sourceCode = null; + ObjectCache cache = MemoryCache.Default; + + if (_cachingEnabled) + sourceCode = cache[context.Request.PhysicalPath] as string; + + if (sourceCode == null) + { + CacheItemPolicy policy = new CacheItemPolicy(); + + List filePaths = new List(); + filePaths.Add(context.Request.PhysicalPath); + policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); + + // Загружаем файл и помещаем его в кэш + sourceCode = File.ReadAllText(context.Request.PhysicalPath); + cache.Set(context.Request.PhysicalPath, sourceCode, policy); + } + #endregion + + var runner = _hostedScript.EngineInstance.AttachedScriptsFactory.LoadFromString( + _hostedScript.EngineInstance.GetCompilerService(), sourceCode); + + int exitCode = 0; + + try + { + int methodIndex = runner.FindMethod("ОбработкаВызоваHTTPСервиса"); + IValue result; + IValue[] args = new IValue[1]; + args[0] = new ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceRequestImpl(context); + + runner.CallAsFunction(methodIndex, args, out result); + + // Обрабатываем результаты + ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceResponseImpl response = (ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceResponseImpl)result; + context.Response.StatusCode = response.StatusCode; + + if (response.Headers != null) + { + + foreach (ScriptEngine.HostedScript.Library.KeyAndValueImpl ch in response.Headers) + { + context.Response.AddHeader(ch.Key.AsString(), ch.Value.AsString()); + } + } + + if (response.Reason != "") + { + context.Response.Status = response.Reason; + } + + if (response.BodyStream != null) + { + response.BodyStream.Seek(0, SeekOrigin.Begin); + response.BodyStream.CopyTo(context.Response.OutputStream); + } + + context.Response.Charset = response.ContentCharset; + + } + catch (ScriptInterruptionException e) + { + exitCode = e.ExitCode; + context.Response.StatusCode = 500; + context.Response.Status = "Script running error"; + context.Response.SubStatusCode = exitCode; + context.Response.StatusDescription = e.Message; + } + catch (Exception e) + { + context.Response.StatusCode = 500; + context.Response.Status = e.Message; + } + finally + { + context.Response.End(); + } + + } + } +} diff --git a/src/ASPNETHandler/DemoApp/Default.os b/src/ASPNETHandler/DemoApp/Default.os new file mode 100644 index 000000000..4b851ab35 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/Default.os @@ -0,0 +1,57 @@ + +// Это предопределенная функция - обработчик запроса HTTP-сервиса +// +Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт + + Если Запрос.HTTPМетод = "GET" Тогда + + Возврат ПоказатьГлавнуюСтраницу(Запрос); + + Иначе + + Возврат ПоказатьИсходныйКод(Запрос); + + КонецЕсли; + +КонецФункции + +Функция ПоказатьГлавнуюСтраницу(Запрос) + + Контекст = Запрос.Контекст; + + ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Default.ospt"); + СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона); + СтрокаТело = СтрЗаменить(СтрокаШаблон, "{ClientAddress}", Контекст.АдресКлиента); + + Ответ = Новый HTTPСервисОтвет(200); + Ответ.УстановитьТелоИзСтроки(СтрокаТело); + + Возврат Ответ; + +КонецФункции + +Функция ПоказатьИсходныйКод(Запрос) + + Контекст = Запрос.Контекст; + + СтрокаИсходныйКод = ПолучитьМакетСтраницы(Контекст.ФизическийПуть); + + ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Source.ospt"); + СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона); + + СтрокаТело = СтрЗаменить(СтрокаШаблон, "{SourceCode}", СтрокаИсходныйКод); + + Ответ = Новый HTTPСервисОтвет(200); + Ответ.УстановитьТелоИзСтроки(СтрокаТело); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьМакетСтраницы(ПутьКФайлу) + + Документ = Новый ТекстовыйДокумент; + Документ.Прочитать(ПутьКФайлу); + Возврат Документ.ПолучитьТекст(); + +КонецФункции \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/Default.ospt b/src/ASPNETHandler/DemoApp/Default.ospt new file mode 100644 index 000000000..b70b1d892 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/Default.ospt @@ -0,0 +1,24 @@ + + + + + + OneScript HTTP Service Test Page + + + +
+

Привет ({ClientAddress})!

+

Эта страница создана HTTP сервисом OneScript.

+
+
+
+
+ + +
+
+
+ + + \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/highlight.pack.js b/src/ASPNETHandler/DemoApp/highlight.pack.js new file mode 100644 index 000000000..2b63060fe --- /dev/null +++ b/src/ASPNETHandler/DemoApp/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("1c",function(s){var x="[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+",o="далее ",m="возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ",t=o+m,l="загрузитьизфайла ",e="вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ",n=l+e,a="разделительстраниц разделительстрок символтабуляции ",d="ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон ",i="acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища ",c="wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ",r=a+d+i+c,p="webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля ",b="автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени форматкартинки ширинаподчиненныхэлементовформы ",w="виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента ",h="авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных ",j="использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц ",z="отображениевремениэлементовпланировщика ",f="типфайлаформатированногодокумента ",k="обходрезультатазапроса типзаписизапроса ",u="видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов ",y="доступкфайлу режимдиалогавыборафайла режимоткрытияфайла ",N="типизмеренияпостроителязапроса ",g="видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений ",E="wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs форматдатыjson экранированиесимволовjson ",M="видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных использованиеусловногооформлениякомпоновкиданных ",_="важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты статусразборапочтовогосообщения ",v="режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации ",A="расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии типхранилищасертификатовкриптографии ",C="кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip режимсохраненияпутейzip уровеньсжатияzip ",L="звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp ",Z="направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса ",$="httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса типномерадокумента типномеразадачи типформы удалениедвижений ",q="важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты",B=p+b+w+h+j+z+f+k+u+y+N+g+E+M+_+v+A+C+L+Z+$+q,I="comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных ",P="comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура фиксированноесоответствие фиксированныймассив ",T=I+P,W="null истина ложь неопределено",D=s.inherit(s.NM),F={cN:"string",b:'"|\\|',e:'"|$',c:[{b:'""'}]},G={b:"'",e:"'",eB:!0,eE:!0,c:[{cN:"number",b:"\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}"}]},H=s.inherit(s.CLCM),J={cN:"meta",l:x,b:"#|&",e:"$",k:{"meta-keyword":t+n},c:[H]},K={cN:"symbol",b:"~",e:";|:",eE:!0},O={cN:"function",l:x,v:[{b:"процедура|функция",e:"\\)",k:"процедура функция"},{b:"конецпроцедуры|конецфункции",k:"конецпроцедуры конецфункции"}],c:[{b:"\\(",e:"\\)",endsParent:!0,c:[{cN:"params",l:x,b:x,e:",",eE:!0,eW:!0,k:{keyword:"знач",literal:W},c:[D,F,G]},H]},s.inherit(s.TM,{b:x})]};return{cI:!0,l:x,k:{keyword:t,built_in:r,"class":B,type:T,literal:W},c:[J,O,H,K,D,F,G]}}); \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/home.png b/src/ASPNETHandler/DemoApp/home.png new file mode 100644 index 000000000..a1686704c Binary files /dev/null and b/src/ASPNETHandler/DemoApp/home.png differ diff --git a/src/ASPNETHandler/DemoApp/source.ospt b/src/ASPNETHandler/DemoApp/source.ospt new file mode 100644 index 000000000..4d9ce78fb --- /dev/null +++ b/src/ASPNETHandler/DemoApp/source.ospt @@ -0,0 +1,25 @@ + + + + + + OneScript HTTP Service Test Page + + + + + + + + +
+ + Go to W3Schools! + +
+

+            {SourceCode}
+        
+ + + \ No newline at end of file diff --git a/src/ASPNETHandler/DemoApp/styles/agate.css b/src/ASPNETHandler/DemoApp/styles/agate.css new file mode 100644 index 000000000..8d64547c5 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/agate.css @@ -0,0 +1,108 @@ +/*! + * Agate by Taufik Nurrohman + * ---------------------------------------------------- + * + * #ade5fc + * #a2fca2 + * #c6b4f0 + * #d36363 + * #fcc28c + * #fc9b9b + * #ffa + * #fff + * #333 + * #62c8f3 + * #888 + * + */ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #333; + color: white; +} + +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-code, +.hljs-emphasis { + font-style: italic; +} + +.hljs-tag { + color: #62c8f3; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-selector-id, +.hljs-selector-class { + color: #ade5fc; +} + +.hljs-string, +.hljs-bullet { + color: #a2fca2; +} + +.hljs-type, +.hljs-title, +.hljs-section, +.hljs-attribute, +.hljs-quote, +.hljs-built_in, +.hljs-builtin-name { + color: #ffa; +} + +.hljs-number, +.hljs-symbol, +.hljs-bullet { + color: #d36363; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color: #fcc28c; +} + +.hljs-comment, +.hljs-deletion, +.hljs-code { + color: #888; +} + +.hljs-regexp, +.hljs-link { + color: #c6b4f0; +} + +.hljs-meta { + color: #fc9b9b; +} + +.hljs-deletion { + background-color: #fc9b9b; + color: #333; +} + +.hljs-addition { + background-color: #a2fca2; + color: #333; +} + +.hljs a { + color: inherit; +} + +.hljs a:focus, +.hljs a:hover { + color: inherit; + text-decoration: underline; +} diff --git a/src/ASPNETHandler/DemoApp/styles/androidstudio.css b/src/ASPNETHandler/DemoApp/styles/androidstudio.css new file mode 100644 index 000000000..bc8e473b5 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/androidstudio.css @@ -0,0 +1,66 @@ +/* +Date: 24 Fev 2015 +Author: Pedro Oliveira +*/ + +.hljs { + color: #a9b7c6; + background: #282b2e; + display: block; + overflow-x: auto; + padding: 0.5em; +} + +.hljs-number, +.hljs-literal, +.hljs-symbol, +.hljs-bullet { + color: #6897BB; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-deletion { + color: #cc7832; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-link { + color: #629755; +} + +.hljs-comment, +.hljs-quote { + color: #808080; +} + +.hljs-meta { + color: #bbb529; +} + +.hljs-string, +.hljs-attribute, +.hljs-addition { + color: #6A8759; +} + +.hljs-section, +.hljs-title, +.hljs-type { + color: #ffc66d; +} + +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #e8bf6a; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/arduino-light.css b/src/ASPNETHandler/DemoApp/styles/arduino-light.css new file mode 100644 index 000000000..4b8b7fd3c --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/arduino-light.css @@ -0,0 +1,88 @@ +/* + +Arduino® Light Theme - Stefania Mellai + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #FFFFFF; +} + +.hljs, +.hljs-subst { + color: #434f54; +} + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-doctag, +.hljs-name { + color: #00979D; +} + +.hljs-built_in, +.hljs-literal, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #D35400; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #00979D; +} + +.hljs-type, +.hljs-string, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #005C5F; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-comment { + color: rgba(149,165,166,.8); +} + +.hljs-meta-keyword { + color: #728E00; +} + +.hljs-meta { + color: #728E00; + color: #434f54; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-function { + color: #728E00; +} + +.hljs-number { + color: #8A7B52; +} diff --git a/src/ASPNETHandler/DemoApp/styles/arta.css b/src/ASPNETHandler/DemoApp/styles/arta.css new file mode 100644 index 000000000..75ef3a9e5 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/arta.css @@ -0,0 +1,73 @@ +/* +Date: 17.V.2011 +Author: pumbur +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #222; +} + +.hljs, +.hljs-subst { + color: #aaa; +} + +.hljs-section { + color: #fff; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #444; +} + +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-regexp { + color: #ffcc33; +} + +.hljs-number, +.hljs-addition { + color: #00cc66; +} + +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-template-variable, +.hljs-attribute, +.hljs-link { + color: #32aaee; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #6644aa; +} + +.hljs-title, +.hljs-variable, +.hljs-deletion, +.hljs-template-tag { + color: #bb1166; +} + +.hljs-section, +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/ascetic.css b/src/ASPNETHandler/DemoApp/styles/ascetic.css new file mode 100644 index 000000000..48397e889 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/ascetic.css @@ -0,0 +1,45 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-symbol, +.hljs-bullet, +.hljs-section, +.hljs-addition, +.hljs-attribute, +.hljs-link { + color: #888; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta, +.hljs-deletion { + color: #ccc; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-name, +.hljs-type, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-cave-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-cave-dark.css new file mode 100644 index 000000000..65428f3b1 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-cave-dark.css @@ -0,0 +1,83 @@ +/* Base16 Atelier Cave Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Cave Comment */ +.hljs-comment, +.hljs-quote { + color: #7e7887; +} + +/* Atelier-Cave Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-regexp, +.hljs-link, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #be4678; +} + +/* Atelier-Cave Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #aa573c; +} + +/* Atelier-Cave Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #2a9292; +} + +/* Atelier-Cave Blue */ +.hljs-title, +.hljs-section { + color: #576ddb; +} + +/* Atelier-Cave Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #955ae7; +} + +.hljs-deletion, +.hljs-addition { + color: #19171c; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #be4678; +} + +.hljs-addition { + background-color: #2a9292; +} + +.hljs { + display: block; + overflow-x: auto; + background: #19171c; + color: #8b8792; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-cave-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-cave-light.css new file mode 100644 index 000000000..b419f9fd8 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-cave-light.css @@ -0,0 +1,85 @@ +/* Base16 Atelier Cave Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Cave Comment */ +.hljs-comment, +.hljs-quote { + color: #655f6d; +} + +/* Atelier-Cave Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #be4678; +} + +/* Atelier-Cave Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #aa573c; +} + +/* Atelier-Cave Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #2a9292; +} + +/* Atelier-Cave Blue */ +.hljs-title, +.hljs-section { + color: #576ddb; +} + +/* Atelier-Cave Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #955ae7; +} + +.hljs-deletion, +.hljs-addition { + color: #19171c; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #be4678; +} + +.hljs-addition { + background-color: #2a9292; +} + +.hljs { + display: block; + overflow-x: auto; + background: #efecf4; + color: #585260; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-dune-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-dune-dark.css new file mode 100644 index 000000000..1684f5225 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-dune-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Dune Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Dune Comment */ +.hljs-comment, +.hljs-quote { + color: #999580; +} + +/* Atelier-Dune Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d73737; +} + +/* Atelier-Dune Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b65611; +} + +/* Atelier-Dune Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #60ac39; +} + +/* Atelier-Dune Blue */ +.hljs-title, +.hljs-section { + color: #6684e1; +} + +/* Atelier-Dune Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #b854d4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #20201d; + color: #a6a28c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-dune-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-dune-light.css new file mode 100644 index 000000000..547719de8 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-dune-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Dune Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Dune Comment */ +.hljs-comment, +.hljs-quote { + color: #7d7a68; +} + +/* Atelier-Dune Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d73737; +} + +/* Atelier-Dune Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b65611; +} + +/* Atelier-Dune Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #60ac39; +} + +/* Atelier-Dune Blue */ +.hljs-title, +.hljs-section { + color: #6684e1; +} + +/* Atelier-Dune Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #b854d4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #fefbec; + color: #6e6b5e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-estuary-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-estuary-dark.css new file mode 100644 index 000000000..a5e507187 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-estuary-dark.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Estuary Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Estuary Comment */ +.hljs-comment, +.hljs-quote { + color: #878573; +} + +/* Atelier-Estuary Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ba6236; +} + +/* Atelier-Estuary Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ae7313; +} + +/* Atelier-Estuary Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7d9726; +} + +/* Atelier-Estuary Blue */ +.hljs-title, +.hljs-section { + color: #36a166; +} + +/* Atelier-Estuary Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #5f9182; +} + +.hljs-deletion, +.hljs-addition { + color: #22221b; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ba6236; +} + +.hljs-addition { + background-color: #7d9726; +} + +.hljs { + display: block; + overflow-x: auto; + background: #22221b; + color: #929181; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-estuary-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-estuary-light.css new file mode 100644 index 000000000..1daee5d98 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-estuary-light.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Estuary Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Estuary Comment */ +.hljs-comment, +.hljs-quote { + color: #6c6b5a; +} + +/* Atelier-Estuary Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ba6236; +} + +/* Atelier-Estuary Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ae7313; +} + +/* Atelier-Estuary Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7d9726; +} + +/* Atelier-Estuary Blue */ +.hljs-title, +.hljs-section { + color: #36a166; +} + +/* Atelier-Estuary Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #5f9182; +} + +.hljs-deletion, +.hljs-addition { + color: #22221b; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ba6236; +} + +.hljs-addition { + background-color: #7d9726; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f4f3ec; + color: #5f5e4e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-forest-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-forest-dark.css new file mode 100644 index 000000000..0ef4fae31 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-forest-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Forest Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Forest Comment */ +.hljs-comment, +.hljs-quote { + color: #9c9491; +} + +/* Atelier-Forest Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #f22c40; +} + +/* Atelier-Forest Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #df5320; +} + +/* Atelier-Forest Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7b9726; +} + +/* Atelier-Forest Blue */ +.hljs-title, +.hljs-section { + color: #407ee7; +} + +/* Atelier-Forest Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6666ea; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1b1918; + color: #a8a19f; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-forest-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-forest-light.css new file mode 100644 index 000000000..bbedde18a --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-forest-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Forest Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Forest Comment */ +.hljs-comment, +.hljs-quote { + color: #766e6b; +} + +/* Atelier-Forest Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #f22c40; +} + +/* Atelier-Forest Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #df5320; +} + +/* Atelier-Forest Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #7b9726; +} + +/* Atelier-Forest Blue */ +.hljs-title, +.hljs-section { + color: #407ee7; +} + +/* Atelier-Forest Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6666ea; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f1efee; + color: #68615e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-heath-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-heath-dark.css new file mode 100644 index 000000000..fe01ff721 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-heath-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Heath Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Heath Comment */ +.hljs-comment, +.hljs-quote { + color: #9e8f9e; +} + +/* Atelier-Heath Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca402b; +} + +/* Atelier-Heath Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #a65926; +} + +/* Atelier-Heath Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #918b3b; +} + +/* Atelier-Heath Blue */ +.hljs-title, +.hljs-section { + color: #516aec; +} + +/* Atelier-Heath Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #7b59c0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1b181b; + color: #ab9bab; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-heath-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-heath-light.css new file mode 100644 index 000000000..ee43786d1 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-heath-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Heath Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Heath Comment */ +.hljs-comment, +.hljs-quote { + color: #776977; +} + +/* Atelier-Heath Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca402b; +} + +/* Atelier-Heath Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #a65926; +} + +/* Atelier-Heath Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #918b3b; +} + +/* Atelier-Heath Blue */ +.hljs-title, +.hljs-section { + color: #516aec; +} + +/* Atelier-Heath Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #7b59c0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f7f3f7; + color: #695d69; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-dark.css new file mode 100644 index 000000000..a937d3bf5 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Lakeside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Lakeside Comment */ +.hljs-comment, +.hljs-quote { + color: #7195a8; +} + +/* Atelier-Lakeside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d22d72; +} + +/* Atelier-Lakeside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #935c25; +} + +/* Atelier-Lakeside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #568c3b; +} + +/* Atelier-Lakeside Blue */ +.hljs-title, +.hljs-section { + color: #257fad; +} + +/* Atelier-Lakeside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6b6bb8; +} + +.hljs { + display: block; + overflow-x: auto; + background: #161b1d; + color: #7ea2b4; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-light.css new file mode 100644 index 000000000..6c7e8f9ef --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-lakeside-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Lakeside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Lakeside Comment */ +.hljs-comment, +.hljs-quote { + color: #5a7b8c; +} + +/* Atelier-Lakeside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d22d72; +} + +/* Atelier-Lakeside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #935c25; +} + +/* Atelier-Lakeside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #568c3b; +} + +/* Atelier-Lakeside Blue */ +.hljs-title, +.hljs-section { + color: #257fad; +} + +/* Atelier-Lakeside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6b6bb8; +} + +.hljs { + display: block; + overflow-x: auto; + background: #ebf8ff; + color: #516d7b; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-plateau-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-plateau-dark.css new file mode 100644 index 000000000..3bb052693 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-plateau-dark.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Plateau Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Plateau Comment */ +.hljs-comment, +.hljs-quote { + color: #7e7777; +} + +/* Atelier-Plateau Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca4949; +} + +/* Atelier-Plateau Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b45a3c; +} + +/* Atelier-Plateau Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #4b8b8b; +} + +/* Atelier-Plateau Blue */ +.hljs-title, +.hljs-section { + color: #7272ca; +} + +/* Atelier-Plateau Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8464c4; +} + +.hljs-deletion, +.hljs-addition { + color: #1b1818; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ca4949; +} + +.hljs-addition { + background-color: #4b8b8b; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1b1818; + color: #8a8585; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-plateau-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-plateau-light.css new file mode 100644 index 000000000..5f0222bec --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-plateau-light.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Plateau Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Plateau Comment */ +.hljs-comment, +.hljs-quote { + color: #655d5d; +} + +/* Atelier-Plateau Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #ca4949; +} + +/* Atelier-Plateau Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b45a3c; +} + +/* Atelier-Plateau Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #4b8b8b; +} + +/* Atelier-Plateau Blue */ +.hljs-title, +.hljs-section { + color: #7272ca; +} + +/* Atelier-Plateau Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8464c4; +} + +.hljs-deletion, +.hljs-addition { + color: #1b1818; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #ca4949; +} + +.hljs-addition { + background-color: #4b8b8b; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f4ecec; + color: #585050; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-savanna-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-savanna-dark.css new file mode 100644 index 000000000..38f831431 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-savanna-dark.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Savanna Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Savanna Comment */ +.hljs-comment, +.hljs-quote { + color: #78877d; +} + +/* Atelier-Savanna Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #b16139; +} + +/* Atelier-Savanna Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #9f713c; +} + +/* Atelier-Savanna Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #489963; +} + +/* Atelier-Savanna Blue */ +.hljs-title, +.hljs-section { + color: #478c90; +} + +/* Atelier-Savanna Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #55859b; +} + +.hljs-deletion, +.hljs-addition { + color: #171c19; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #b16139; +} + +.hljs-addition { + background-color: #489963; +} + +.hljs { + display: block; + overflow-x: auto; + background: #171c19; + color: #87928a; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-savanna-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-savanna-light.css new file mode 100644 index 000000000..1ccd7c685 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-savanna-light.css @@ -0,0 +1,84 @@ +/* Base16 Atelier Savanna Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Savanna Comment */ +.hljs-comment, +.hljs-quote { + color: #5f6d64; +} + +/* Atelier-Savanna Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #b16139; +} + +/* Atelier-Savanna Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #9f713c; +} + +/* Atelier-Savanna Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #489963; +} + +/* Atelier-Savanna Blue */ +.hljs-title, +.hljs-section { + color: #478c90; +} + +/* Atelier-Savanna Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #55859b; +} + +.hljs-deletion, +.hljs-addition { + color: #171c19; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #b16139; +} + +.hljs-addition { + background-color: #489963; +} + +.hljs { + display: block; + overflow-x: auto; + background: #ecf4ee; + color: #526057; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-seaside-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-seaside-dark.css new file mode 100644 index 000000000..df29949c6 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-seaside-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Seaside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Seaside Comment */ +.hljs-comment, +.hljs-quote { + color: #809980; +} + +/* Atelier-Seaside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #e6193c; +} + +/* Atelier-Seaside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #87711d; +} + +/* Atelier-Seaside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #29a329; +} + +/* Atelier-Seaside Blue */ +.hljs-title, +.hljs-section { + color: #3d62f5; +} + +/* Atelier-Seaside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #ad2bee; +} + +.hljs { + display: block; + overflow-x: auto; + background: #131513; + color: #8ca68c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-seaside-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-seaside-light.css new file mode 100644 index 000000000..9d960f29f --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-seaside-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Seaside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Seaside Comment */ +.hljs-comment, +.hljs-quote { + color: #687d68; +} + +/* Atelier-Seaside Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #e6193c; +} + +/* Atelier-Seaside Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #87711d; +} + +/* Atelier-Seaside Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #29a329; +} + +/* Atelier-Seaside Blue */ +.hljs-title, +.hljs-section { + color: #3d62f5; +} + +/* Atelier-Seaside Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #ad2bee; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f4fbf4; + color: #5e6e5e; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-dark.css b/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-dark.css new file mode 100644 index 000000000..c2ab7938d --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-dark.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Sulphurpool Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Sulphurpool Comment */ +.hljs-comment, +.hljs-quote { + color: #898ea4; +} + +/* Atelier-Sulphurpool Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #c94922; +} + +/* Atelier-Sulphurpool Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #c76b29; +} + +/* Atelier-Sulphurpool Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #ac9739; +} + +/* Atelier-Sulphurpool Blue */ +.hljs-title, +.hljs-section { + color: #3d8fd1; +} + +/* Atelier-Sulphurpool Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6679cc; +} + +.hljs { + display: block; + overflow-x: auto; + background: #202746; + color: #979db4; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-light.css b/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-light.css new file mode 100644 index 000000000..96c47d086 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atelier-sulphurpool-light.css @@ -0,0 +1,69 @@ +/* Base16 Atelier Sulphurpool Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ + +/* Atelier-Sulphurpool Comment */ +.hljs-comment, +.hljs-quote { + color: #6b7394; +} + +/* Atelier-Sulphurpool Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #c94922; +} + +/* Atelier-Sulphurpool Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #c76b29; +} + +/* Atelier-Sulphurpool Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #ac9739; +} + +/* Atelier-Sulphurpool Blue */ +.hljs-title, +.hljs-section { + color: #3d8fd1; +} + +/* Atelier-Sulphurpool Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #6679cc; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f5f7ff; + color: #5e6687; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atom-one-dark.css b/src/ASPNETHandler/DemoApp/styles/atom-one-dark.css new file mode 100644 index 000000000..1616aafe3 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atom-one-dark.css @@ -0,0 +1,96 @@ +/* + +Atom One Dark by Daniel Gamage +Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax + +base: #282c34 +mono-1: #abb2bf +mono-2: #818896 +mono-3: #5c6370 +hue-1: #56b6c2 +hue-2: #61aeee +hue-3: #c678dd +hue-4: #98c379 +hue-5: #e06c75 +hue-5-2: #be5046 +hue-6: #d19a66 +hue-6-2: #e6c07b + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #abb2bf; + background: #282c34; +} + +.hljs-comment, +.hljs-quote { + color: #5c6370; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #c678dd; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e06c75; +} + +.hljs-literal { + color: #56b6c2; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #98c379; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #e6c07b; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #d19a66; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #61aeee; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/src/ASPNETHandler/DemoApp/styles/atom-one-light.css b/src/ASPNETHandler/DemoApp/styles/atom-one-light.css new file mode 100644 index 000000000..d5bd1d2a9 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/atom-one-light.css @@ -0,0 +1,96 @@ +/* + +Atom One Light by Daniel Gamage +Original One Light Syntax theme from https://github.com/atom/one-light-syntax + +base: #fafafa +mono-1: #383a42 +mono-2: #686b77 +mono-3: #a0a1a7 +hue-1: #0184bb +hue-2: #4078f2 +hue-3: #a626a4 +hue-4: #50a14f +hue-5: #e45649 +hue-5-2: #c91243 +hue-6: #986801 +hue-6-2: #c18401 + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #383a42; + background: #fafafa; +} + +.hljs-comment, +.hljs-quote { + color: #a0a1a7; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #a626a4; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e45649; +} + +.hljs-literal { + color: #0184bb; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #50a14f; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #c18401; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #986801; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #4078f2; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/src/ASPNETHandler/DemoApp/styles/brown-paper.css b/src/ASPNETHandler/DemoApp/styles/brown-paper.css new file mode 100644 index 000000000..f0197b924 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/brown-paper.css @@ -0,0 +1,64 @@ +/* + +Brown Paper style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background:#b7a68e url(./brown-papersq.png); +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst { + color: #363c69; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable, +.hljs-link, +.hljs-name { + color: #2c009f; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta, +.hljs-deletion { + color: #802022; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/brown-papersq.png b/src/ASPNETHandler/DemoApp/styles/brown-papersq.png new file mode 100644 index 000000000..3813903db Binary files /dev/null and b/src/ASPNETHandler/DemoApp/styles/brown-papersq.png differ diff --git a/src/ASPNETHandler/DemoApp/styles/codepen-embed.css b/src/ASPNETHandler/DemoApp/styles/codepen-embed.css new file mode 100644 index 000000000..195c4a078 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/codepen-embed.css @@ -0,0 +1,60 @@ +/* + codepen.io Embed Theme + Author: Justin Perry + Original theme - https://github.com/chriskempson/tomorrow-theme +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #222; + color: #fff; +} + +.hljs-comment, +.hljs-quote { + color: #777; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-regexp, +.hljs-meta, +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-params, +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-deletion { + color: #ab875d; +} + +.hljs-section, +.hljs-title, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-type, +.hljs-attribute { + color: #9b869b; +} + +.hljs-string, +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #8f9c6c; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/color-brewer.css b/src/ASPNETHandler/DemoApp/styles/color-brewer.css new file mode 100644 index 000000000..7934d986a --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/color-brewer.css @@ -0,0 +1,71 @@ +/* + +Colorbrewer theme +Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock +Ported by Fabrício Tavares de Oliveira + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fff; +} + +.hljs, +.hljs-subst { + color: #000; +} + +.hljs-string, +.hljs-meta, +.hljs-symbol, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition { + color: #756bb1; +} + +.hljs-comment, +.hljs-quote { + color: #636363; +} + +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-bullet, +.hljs-link { + color: #31a354; +} + +.hljs-deletion, +.hljs-variable { + color: #88f; +} + + + +.hljs-keyword, +.hljs-selector-tag, +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-doctag, +.hljs-type, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-strong { + color: #3182bd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-attribute { + color: #e6550d; +} diff --git a/src/ASPNETHandler/DemoApp/styles/darcula.css b/src/ASPNETHandler/DemoApp/styles/darcula.css new file mode 100644 index 000000000..be182d0b5 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/darcula.css @@ -0,0 +1,77 @@ +/* + +Darcula color scheme from the JetBrains family of IDEs + +*/ + + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #2b2b2b; +} + +.hljs { + color: #bababa; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-link, +.hljs-number, +.hljs-regexp, +.hljs-literal { + color: #6896ba; +} + +.hljs-code, +.hljs-selector-class { + color: #a6e22e; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-attribute, +.hljs-name, +.hljs-variable { + color: #cb7832; +} + +.hljs-params { + color: #b9b9b9; +} + +.hljs-string { + color: #6a8759; +} + +.hljs-subst, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-symbol, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition { + color: #e0c46c; +} + +.hljs-comment, +.hljs-deletion, +.hljs-meta { + color: #7f7f7f; +} diff --git a/src/ASPNETHandler/DemoApp/styles/dark.css b/src/ASPNETHandler/DemoApp/styles/dark.css new file mode 100644 index 000000000..b4724f5f5 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/dark.css @@ -0,0 +1,63 @@ +/* + +Dark style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #444; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-section, +.hljs-link { + color: white; +} + +.hljs, +.hljs-subst { + color: #ddd; +} + +.hljs-string, +.hljs-title, +.hljs-name, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #d88; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #777; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/darkula.css b/src/ASPNETHandler/DemoApp/styles/darkula.css new file mode 100644 index 000000000..f4646c3c5 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/darkula.css @@ -0,0 +1,6 @@ +/* + Deprecated due to a typo in the name and left here for compatibility purpose only. + Please use darcula.css instead. +*/ + +@import url('darcula.css'); diff --git a/src/ASPNETHandler/DemoApp/styles/default.css b/src/ASPNETHandler/DemoApp/styles/default.css new file mode 100644 index 000000000..f1bfade31 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/default.css @@ -0,0 +1,99 @@ +/* + +Original highlight.js style (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #F0F0F0; +} + + +/* Base color: saturation 0; */ + +.hljs, +.hljs-subst { + color: #444; +} + +.hljs-comment { + color: #888888; +} + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; +} + + +/* User color: hue: 0 */ + +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #BC6060; +} + + +/* Language color: hue: 90; */ + +.hljs-literal { + color: #78A960; +} + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; +} + + +/* Meta color: hue: 200 */ + +.hljs-meta { + color: #1f7199; +} + +.hljs-meta-string { + color: #4d99bf; +} + + +/* Misc effects */ + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/docco.css b/src/ASPNETHandler/DemoApp/styles/docco.css new file mode 100644 index 000000000..db366be37 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/docco.css @@ -0,0 +1,97 @@ +/* +Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars) +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #000; + background: #f8f8ff; +} + +.hljs-comment, +.hljs-quote { + color: #408080; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-subst { + color: #954121; +} + +.hljs-number { + color: #40a070; +} + +.hljs-string, +.hljs-doctag { + color: #219161; +} + +.hljs-selector-id, +.hljs-selector-class, +.hljs-section, +.hljs-type { + color: #19469d; +} + +.hljs-params { + color: #00f; +} + +.hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-variable, +.hljs-template-variable { + color: #008080; +} + +.hljs-regexp, +.hljs-link { + color: #b68; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/dracula.css b/src/ASPNETHandler/DemoApp/styles/dracula.css new file mode 100644 index 000000000..d591db680 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/dracula.css @@ -0,0 +1,76 @@ +/* + +Dracula Theme v1.2.0 + +https://github.com/zenorocha/dracula-theme + +Copyright 2015, All rights reserved + +Code licensed under the MIT license +http://zenorocha.mit-license.org + +@author Éverton Ribeiro +@author Zeno Rocha + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282a36; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-section, +.hljs-link { + color: #8be9fd; +} + +.hljs-function .hljs-keyword { + color: #ff79c6; +} + +.hljs, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-string, +.hljs-title, +.hljs-name, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #f1fa8c; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #6272a4; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/far.css b/src/ASPNETHandler/DemoApp/styles/far.css new file mode 100644 index 000000000..2b3f87b56 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/far.css @@ -0,0 +1,71 @@ +/* + +FAR Style (c) MajestiC + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000080; +} + +.hljs, +.hljs-subst { + color: #0ff; +} + +.hljs-string, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-builtin-name, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition { + color: #ff0; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-variable { + color: #fff; +} + +.hljs-comment, +.hljs-quote, +.hljs-doctag, +.hljs-deletion { + color: #888; +} + +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-link { + color: #0f0; +} + +.hljs-meta { + color: #008080; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/foundation.css b/src/ASPNETHandler/DemoApp/styles/foundation.css new file mode 100644 index 000000000..f1fe64b37 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/foundation.css @@ -0,0 +1,88 @@ +/* +Description: Foundation 4 docs style for highlight.js +Author: Dan Allen +Website: http://foundation.zurb.com/docs/ +Version: 1.0 +Date: 2013-04-02 +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #eee; color: black; +} + +.hljs-link, +.hljs-emphasis, +.hljs-attribute, +.hljs-addition { + color: #070; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong, +.hljs-string, +.hljs-deletion { + color: #d14; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-quote, +.hljs-comment { + color: #998; + font-style: italic; +} + +.hljs-section, +.hljs-title { + color: #900; +} + +.hljs-class .hljs-title, +.hljs-type { + color: #458; +} + +.hljs-variable, +.hljs-template-variable { + color: #336699; +} + +.hljs-bullet { + color: #997700; +} + +.hljs-meta { + color: #3344bb; +} + +.hljs-code, +.hljs-number, +.hljs-literal, +.hljs-keyword, +.hljs-selector-tag { + color: #099; +} + +.hljs-regexp { + background-color: #fff0ff; + color: #880088; +} + +.hljs-symbol { + color: #990073; +} + +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #007700; +} diff --git a/src/ASPNETHandler/DemoApp/styles/github-gist.css b/src/ASPNETHandler/DemoApp/styles/github-gist.css new file mode 100644 index 000000000..155f0b916 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/github-gist.css @@ -0,0 +1,71 @@ +/** + * GitHub Gist Theme + * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro + */ + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/src/ASPNETHandler/DemoApp/styles/github.css b/src/ASPNETHandler/DemoApp/styles/github.css new file mode 100644 index 000000000..791932b87 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/github.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/googlecode.css b/src/ASPNETHandler/DemoApp/styles/googlecode.css new file mode 100644 index 000000000..884ad6353 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/googlecode.css @@ -0,0 +1,89 @@ +/* + +Google Code style (c) Aahan Krish + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-comment, +.hljs-quote { + color: #800; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-section, +.hljs-title, +.hljs-name { + color: #008; +} + +.hljs-variable, +.hljs-template-variable { + color: #660; +} + +.hljs-string, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-regexp { + color: #080; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-meta, +.hljs-number, +.hljs-link { + color: #066; +} + +.hljs-title, +.hljs-doctag, +.hljs-type, +.hljs-attr, +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #606; +} + +.hljs-attribute, +.hljs-subst { + color: #000; +} + +.hljs-formula { + background-color: #eee; + font-style: italic; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #9B703F +} + +.hljs-addition { + background-color: #baeeba; +} + +.hljs-deletion { + background-color: #ffc8bd; +} + +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/grayscale.css b/src/ASPNETHandler/DemoApp/styles/grayscale.css new file mode 100644 index 000000000..5376f3406 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/grayscale.css @@ -0,0 +1,101 @@ +/* + +grayscale style (c) MY Sun + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #fff; +} + +.hljs-comment, +.hljs-quote { + color: #777; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal { + color: #777; +} + +.hljs-string, +.hljs-doctag, +.hljs-formula { + color: #333; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJ0lEQVQIW2O8e/fufwYGBgZBQUEQxcCIIfDu3Tuwivfv30NUoAsAALHpFMMLqZlPAAAAAElFTkSuQmCC) repeat; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #000; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-class .hljs-title, +.hljs-type, +.hljs-name { + color: #333; + font-weight: bold; +} + +.hljs-tag { + color: #333; +} + +.hljs-regexp { + color: #333; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAN37979r6yszIgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQDexSef15DBCwAAAABJRU5ErkJggg==) repeat; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #000; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAKElEQVQIW2NkQAO7d+/+z4gsBhJwdXVlhAvCBECKwIIwAbhKZBUwBQA6hBpm5efZsgAAAABJRU5ErkJggg==) repeat; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #000; + text-decoration: underline; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + color: #fff; + background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAE0lEQVQIW2MMDQ39zzhz5kwIAQAyxweWgUHd1AAAAABJRU5ErkJggg==) repeat; +} + +.hljs-addition { + color: #000; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAALUlEQVQYV2N89+7dfwYk8P79ewZBQUFkIQZGOiu6e/cuiptQHAPl0NtNxAQBAM97Oejj3Dg7AAAAAElFTkSuQmCC) repeat; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/gruvbox-dark.css b/src/ASPNETHandler/DemoApp/styles/gruvbox-dark.css new file mode 100644 index 000000000..f563811a8 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/gruvbox-dark.css @@ -0,0 +1,108 @@ +/* + +Gruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282828; +} + +.hljs, +.hljs-subst { + color: #ebdbb2; +} + +/* Gruvbox Red */ +.hljs-deletion, +.hljs-formula, +.hljs-keyword, +.hljs-link, +.hljs-selector-tag { + color: #fb4934; +} + +/* Gruvbox Blue */ +.hljs-built_in, +.hljs-emphasis, +.hljs-name, +.hljs-quote, +.hljs-strong, +.hljs-title, +.hljs-variable { + color: #83a598; +} + +/* Gruvbox Yellow */ +.hljs-attr, +.hljs-params, +.hljs-template-tag, +.hljs-type { + color: #fabd2f; +} + +/* Gruvbox Purple */ +.hljs-builtin-name, +.hljs-doctag, +.hljs-literal, +.hljs-number { + color: #8f3f71; +} + +/* Gruvbox Orange */ +.hljs-code, +.hljs-meta, +.hljs-regexp, +.hljs-selector-id, +.hljs-template-variable { + color: #fe8019; +} + +/* Gruvbox Green */ +.hljs-addition, +.hljs-meta-string, +.hljs-section, +.hljs-selector-attr, +.hljs-selector-class, +.hljs-string, +.hljs-symbol { + color: #b8bb26; +} + +/* Gruvbox Aqua */ +.hljs-attribute, +.hljs-bullet, +.hljs-class, +.hljs-function, +.hljs-function .hljs-keyword, +.hljs-meta-keyword, +.hljs-selector-pseudo, +.hljs-tag { + color: #8ec07c; +} + +/* Gruvbox Gray */ +.hljs-comment { + color: #928374; +} + +/* Gruvbox Purple */ +.hljs-link_label, +.hljs-literal, +.hljs-number { + color: #d3869b; +} + +.hljs-comment, +.hljs-emphasis { + font-style: italic; +} + +.hljs-section, +.hljs-strong, +.hljs-tag { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/gruvbox-light.css b/src/ASPNETHandler/DemoApp/styles/gruvbox-light.css new file mode 100644 index 000000000..ff45468eb --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/gruvbox-light.css @@ -0,0 +1,108 @@ +/* + +Gruvbox style (light) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fbf1c7; +} + +.hljs, +.hljs-subst { + color: #3c3836; +} + +/* Gruvbox Red */ +.hljs-deletion, +.hljs-formula, +.hljs-keyword, +.hljs-link, +.hljs-selector-tag { + color: #9d0006; +} + +/* Gruvbox Blue */ +.hljs-built_in, +.hljs-emphasis, +.hljs-name, +.hljs-quote, +.hljs-strong, +.hljs-title, +.hljs-variable { + color: #076678; +} + +/* Gruvbox Yellow */ +.hljs-attr, +.hljs-params, +.hljs-template-tag, +.hljs-type { + color: #b57614; +} + +/* Gruvbox Purple */ +.hljs-builtin-name, +.hljs-doctag, +.hljs-literal, +.hljs-number { + color: #8f3f71; +} + +/* Gruvbox Orange */ +.hljs-code, +.hljs-meta, +.hljs-regexp, +.hljs-selector-id, +.hljs-template-variable { + color: #af3a03; +} + +/* Gruvbox Green */ +.hljs-addition, +.hljs-meta-string, +.hljs-section, +.hljs-selector-attr, +.hljs-selector-class, +.hljs-string, +.hljs-symbol { + color: #79740e; +} + +/* Gruvbox Aqua */ +.hljs-attribute, +.hljs-bullet, +.hljs-class, +.hljs-function, +.hljs-function .hljs-keyword, +.hljs-meta-keyword, +.hljs-selector-pseudo, +.hljs-tag { + color: #427b58; +} + +/* Gruvbox Gray */ +.hljs-comment { + color: #928374; +} + +/* Gruvbox Purple */ +.hljs-link_label, +.hljs-literal, +.hljs-number { + color: #8f3f71; +} + +.hljs-comment, +.hljs-emphasis { + font-style: italic; +} + +.hljs-section, +.hljs-strong, +.hljs-tag { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/hopscotch.css b/src/ASPNETHandler/DemoApp/styles/hopscotch.css new file mode 100644 index 000000000..32e60d230 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/hopscotch.css @@ -0,0 +1,83 @@ +/* + * Hopscotch + * by Jan T. Sott + * https://github.com/idleberg/Hopscotch + * + * This work is licensed under the Creative Commons CC0 1.0 Universal License + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #989498; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-link, +.hljs-deletion { + color: #dd464c; +} + +/* Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #fd8b19; +} + +/* Yellow */ +.hljs-class .hljs-title { + color: #fdcc59; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #8fc13e; +} + +/* Aqua */ +.hljs-meta { + color: #149b93; +} + +/* Blue */ +.hljs-function, +.hljs-section, +.hljs-title { + color: #1290bf; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #c85e7c; +} + +.hljs { + display: block; + background: #322931; + color: #b9b5b8; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/hybrid.css b/src/ASPNETHandler/DemoApp/styles/hybrid.css new file mode 100644 index 000000000..29735a189 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/hybrid.css @@ -0,0 +1,102 @@ +/* + +vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid) + +*/ + +/*background color*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #1d1f21; +} + +/*selection color*/ +.hljs::selection, +.hljs span::selection { + background: #373b41; +} + +.hljs::-moz-selection, +.hljs span::-moz-selection { + background: #373b41; +} + +/*foreground color*/ +.hljs { + color: #c5c8c6; +} + +/*color: fg_yellow*/ +.hljs-title, +.hljs-name { + color: #f0c674; +} + +/*color: fg_comment*/ +.hljs-comment, +.hljs-meta, +.hljs-meta .hljs-keyword { + color: #707880; +} + +/*color: fg_red*/ +.hljs-number, +.hljs-symbol, +.hljs-literal, +.hljs-deletion, +.hljs-link { + color: #cc6666 +} + +/*color: fg_green*/ +.hljs-string, +.hljs-doctag, +.hljs-addition, +.hljs-regexp, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #b5bd68; +} + +/*color: fg_purple*/ +.hljs-attribute, +.hljs-code, +.hljs-selector-id { + color: #b294bb; +} + +/*color: fg_blue*/ +.hljs-keyword, +.hljs-selector-tag, +.hljs-bullet, +.hljs-tag { + color: #81a2be; +} + +/*color: fg_aqua*/ +.hljs-subst, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #8abeb7; +} + +/*color: fg_orange*/ +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-quote, +.hljs-section, +.hljs-selector-class { + color: #de935f; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/idea.css b/src/ASPNETHandler/DemoApp/styles/idea.css new file mode 100644 index 000000000..3bf1892bd --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/idea.css @@ -0,0 +1,97 @@ +/* + +Intellij Idea-like styling (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #000; + background: #fff; +} + +.hljs-subst, +.hljs-title { + font-weight: normal; + color: #000; +} + +.hljs-comment, +.hljs-quote { + color: #808080; + font-style: italic; +} + +.hljs-meta { + color: #808000; +} + +.hljs-tag { + background: #efefef; +} + +.hljs-section, +.hljs-name, +.hljs-literal, +.hljs-keyword, +.hljs-selector-tag, +.hljs-type, +.hljs-selector-id, +.hljs-selector-class { + font-weight: bold; + color: #000080; +} + +.hljs-attribute, +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: bold; + color: #0000ff; +} + +.hljs-number, +.hljs-regexp, +.hljs-link { + font-weight: normal; +} + +.hljs-string { + color: #008000; + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +.hljs-doctag { + text-decoration: underline; +} + +.hljs-variable, +.hljs-template-variable { + color: #660e7a; +} + +.hljs-addition { + background: #baeeba; +} + +.hljs-deletion { + background: #ffc8bd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/ir-black.css b/src/ASPNETHandler/DemoApp/styles/ir-black.css new file mode 100644 index 000000000..bd4c755ed --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/ir-black.css @@ -0,0 +1,73 @@ +/* + IR_Black style (c) Vasily Mikhailitchenko +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000; + color: #f8f8f8; +} + +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #7c7c7c; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-tag, +.hljs-name { + color: #96cbfe; +} + +.hljs-attribute, +.hljs-selector-id { + color: #ffffb6; +} + +.hljs-string, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition { + color: #a8ff60; +} + +.hljs-subst { + color: #daefa3; +} + +.hljs-regexp, +.hljs-link { + color: #e9c062; +} + +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-doctag { + color: #ffffb6; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-variable, +.hljs-template-variable, +.hljs-literal { + color: #c6c5fe; +} + +.hljs-number, +.hljs-deletion { + color:#ff73fd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/kimbie.dark.css b/src/ASPNETHandler/DemoApp/styles/kimbie.dark.css new file mode 100644 index 000000000..d139cb5d0 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/kimbie.dark.css @@ -0,0 +1,74 @@ +/* + Name: Kimbie (dark) + Author: Jan T. Sott + License: Creative Commons Attribution-ShareAlike 4.0 Unported License + URL: https://github.com/idleberg/Kimbie-highlight.js +*/ + +/* Kimbie Comment */ +.hljs-comment, +.hljs-quote { + color: #d6baad; +} + +/* Kimbie Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-meta { + color: #dc3958; +} + +/* Kimbie Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion, +.hljs-link { + color: #f79a32; +} + +/* Kimbie Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #f06431; +} + +/* Kimbie Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #889b4a; +} + +/* Kimbie Purple */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-function { + color: #98676a; +} + +.hljs { + display: block; + overflow-x: auto; + background: #221a0f; + color: #d3af86; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/kimbie.light.css b/src/ASPNETHandler/DemoApp/styles/kimbie.light.css new file mode 100644 index 000000000..04ff6ed3a --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/kimbie.light.css @@ -0,0 +1,74 @@ +/* + Name: Kimbie (light) + Author: Jan T. Sott + License: Creative Commons Attribution-ShareAlike 4.0 Unported License + URL: https://github.com/idleberg/Kimbie-highlight.js +*/ + +/* Kimbie Comment */ +.hljs-comment, +.hljs-quote { + color: #a57a4c; +} + +/* Kimbie Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-meta { + color: #dc3958; +} + +/* Kimbie Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion, +.hljs-link { + color: #f79a32; +} + +/* Kimbie Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #f06431; +} + +/* Kimbie Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #889b4a; +} + +/* Kimbie Purple */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-function { + color: #98676a; +} + +.hljs { + display: block; + overflow-x: auto; + background: #fbebd4; + color: #84613d; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/magula.css b/src/ASPNETHandler/DemoApp/styles/magula.css new file mode 100644 index 000000000..44dee5e8e --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/magula.css @@ -0,0 +1,70 @@ +/* +Description: Magula style for highligh.js +Author: Ruslan Keba +Website: http://rukeba.com/ +Version: 1.0 +Date: 2009-01-03 +Music: Aphex Twin / Xtal +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background-color: #f4f4f4; +} + +.hljs, +.hljs-subst { + color: black; +} + +.hljs-string, +.hljs-title, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #050; +} + +.hljs-comment, +.hljs-quote { + color: #777; +} + +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-type, +.hljs-link { + color: #800; +} + +.hljs-deletion, +.hljs-meta { + color: #00e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-tag, +.hljs-name { + font-weight: bold; + color: navy; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/mono-blue.css b/src/ASPNETHandler/DemoApp/styles/mono-blue.css new file mode 100644 index 000000000..884c97c76 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/mono-blue.css @@ -0,0 +1,59 @@ +/* + Five-color theme from a single blue hue. +*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #eaeef3; +} + +.hljs { + color: #00193a; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-comment { + color: #738191; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-literal, +.hljs-type, +.hljs-addition, +.hljs-tag, +.hljs-quote, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #0048ab; +} + +.hljs-meta, +.hljs-subst, +.hljs-symbol, +.hljs-regexp, +.hljs-attribute, +.hljs-deletion, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-bullet { + color: #4c81c9; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/monokai-sublime.css b/src/ASPNETHandler/DemoApp/styles/monokai-sublime.css new file mode 100644 index 000000000..2864170da --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/monokai-sublime.css @@ -0,0 +1,83 @@ +/* + +Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #23241f; +} + +.hljs, +.hljs-tag, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-link { + color: #ae81ff; +} + +.hljs-code, +.hljs-title, +.hljs-section, +.hljs-selector-class { + color: #a6e22e; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-name, +.hljs-attr { + color: #f92672; +} + +.hljs-symbol, +.hljs-attribute { + color: #66d9ef; +} + +.hljs-params, +.hljs-class .hljs-title { + color: #f8f8f2; +} + +.hljs-string, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-variable { + color: #e6db74; +} + +.hljs-comment, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} diff --git a/src/ASPNETHandler/DemoApp/styles/monokai.css b/src/ASPNETHandler/DemoApp/styles/monokai.css new file mode 100644 index 000000000..775d53f91 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/monokai.css @@ -0,0 +1,70 @@ +/* +Monokai style - ported by Luigi Maselli - http://grigio.org +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #272822; color: #ddd; +} + +.hljs-tag, +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-strong, +.hljs-name { + color: #f92672; +} + +.hljs-code { + color: #66d9ef; +} + +.hljs-class .hljs-title { + color: white; +} + +.hljs-attribute, +.hljs-symbol, +.hljs-regexp, +.hljs-link { + color: #bf79db; +} + +.hljs-string, +.hljs-bullet, +.hljs-subst, +.hljs-title, +.hljs-section, +.hljs-emphasis, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #a6e22e; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-selector-id { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/obsidian.css b/src/ASPNETHandler/DemoApp/styles/obsidian.css new file mode 100644 index 000000000..356630fa2 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/obsidian.css @@ -0,0 +1,88 @@ +/** + * Obsidian style + * ported by Alexander Marenin (http://github.com/ioncreature) + */ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282b2e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-selector-id { + color: #93c763; +} + +.hljs-number { + color: #ffcd22; +} + +.hljs { + color: #e0e2e4; +} + +.hljs-attribute { + color: #668bb0; +} + +.hljs-code, +.hljs-class .hljs-title, +.hljs-section { + color: white; +} + +.hljs-regexp, +.hljs-link { + color: #d39745; +} + +.hljs-meta { + color: #557182; +} + +.hljs-tag, +.hljs-name, +.hljs-bullet, +.hljs-subst, +.hljs-emphasis, +.hljs-type, +.hljs-built_in, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #8cbbad; +} + +.hljs-string, +.hljs-symbol { + color: #ec7600; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion { + color: #818e96; +} + +.hljs-selector-class { + color: #A082BD +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/ocean.css b/src/ASPNETHandler/DemoApp/styles/ocean.css new file mode 100644 index 000000000..5901581b4 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/ocean.css @@ -0,0 +1,74 @@ +/* Ocean Dark Theme */ +/* https://github.com/gavsiu */ +/* Original theme - https://github.com/chriskempson/base16 */ + +/* Ocean Comment */ +.hljs-comment, +.hljs-quote { + color: #65737e; +} + +/* Ocean Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #bf616a; +} + +/* Ocean Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #d08770; +} + +/* Ocean Yellow */ +.hljs-attribute { + color: #ebcb8b; +} + +/* Ocean Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #a3be8c; +} + +/* Ocean Blue */ +.hljs-title, +.hljs-section { + color: #8fa1b3; +} + +/* Ocean Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #b48ead; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2b303b; + color: #c0c5ce; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/paraiso-dark.css b/src/ASPNETHandler/DemoApp/styles/paraiso-dark.css new file mode 100644 index 000000000..e7292401c --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/paraiso-dark.css @@ -0,0 +1,72 @@ +/* + Paraíso (dark) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-quote { + color: #8d8687; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-link, +.hljs-meta { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion { + color: #f99b15; +} + +/* Paraíso Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #48b685; +} + +/* Paraíso Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #815ba4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2f1e2e; + color: #a39e9b; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/paraiso-light.css b/src/ASPNETHandler/DemoApp/styles/paraiso-light.css new file mode 100644 index 000000000..944857cd8 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/paraiso-light.css @@ -0,0 +1,72 @@ +/* + Paraíso (light) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-quote { + color: #776e71; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-link, +.hljs-meta { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-deletion { + color: #f99b15; +} + +/* Paraíso Yellow */ +.hljs-title, +.hljs-section, +.hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #48b685; +} + +/* Paraíso Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #815ba4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #e7e9db; + color: #4f424c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/pojoaque.css b/src/ASPNETHandler/DemoApp/styles/pojoaque.css new file mode 100644 index 000000000..2e07847b2 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/pojoaque.css @@ -0,0 +1,83 @@ +/* + +Pojoaque Style by Jason Tate +http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +Based on Solarized Style from http://ethanschoonover.com/solarized + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #dccf8f; + background: url(./pojoaque.jpg) repeat scroll left top #181914; +} + +.hljs-comment, +.hljs-quote { + color: #586e75; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-addition { + color: #b64926; +} + +.hljs-number, +.hljs-string, +.hljs-doctag, +.hljs-regexp { + color: #468966; +} + +.hljs-title, +.hljs-section, +.hljs-built_in, +.hljs-name { + color: #ffb03b; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type, +.hljs-tag { + color: #b58900; +} + +.hljs-attribute { + color: #b89859; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-subst, +.hljs-meta { + color: #cb4b16; +} + +.hljs-deletion { + color: #dc322f; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #d3a60c; +} + +.hljs-formula { + background: #073642; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/pojoaque.jpg b/src/ASPNETHandler/DemoApp/styles/pojoaque.jpg new file mode 100644 index 000000000..9c07d4ab4 Binary files /dev/null and b/src/ASPNETHandler/DemoApp/styles/pojoaque.jpg differ diff --git a/src/ASPNETHandler/DemoApp/styles/purebasic.css b/src/ASPNETHandler/DemoApp/styles/purebasic.css new file mode 100644 index 000000000..5ce9b9e07 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/purebasic.css @@ -0,0 +1,96 @@ +/* + +PureBASIC native IDE style ( version 1.0 - April 2016 ) + +by Tristano Ajmone + +Public Domain + +NOTE_1: PureBASIC code syntax highlighting only applies the following classes: + .hljs-comment + .hljs-function + .hljs-keywords + .hljs-string + .hljs-symbol + + Other classes are added here for the benefit of styling other languages with the look and feel of PureBASIC native IDE style. + If you need to customize a stylesheet for PureBASIC only, remove all non-relevant classes -- PureBASIC-related classes are followed by + a "--- used for PureBASIC ... ---" comment on same line. + +NOTE_2: Color names provided in comments were derived using "Name that Color" online tool: + http://chir.ag/projects/name-that-color +*/ + +.hljs { /* Common set of rules required by highlight.js (don'r remove!) */ + display: block; + overflow-x: auto; + padding: 0.5em; + background: #FFFFDF; /* Half and Half (approx.) */ +/* --- Uncomment to add PureBASIC native IDE styled font! + font-family: Consolas; +*/ +} + +.hljs, /* --- used for PureBASIC base color --- */ +.hljs-type, /* --- used for PureBASIC Procedures return type --- */ +.hljs-function, /* --- used for wrapping PureBASIC Procedures definitions --- */ +.hljs-name, +.hljs-number, +.hljs-attr, +.hljs-params, +.hljs-subst { + color: #000000; /* Black */ +} + +.hljs-comment, /* --- used for PureBASIC Comments --- */ +.hljs-regexp, +.hljs-section, +.hljs-selector-pseudo, +.hljs-addition { + color: #00AAAA; /* Persian Green (approx.) */ +} + +.hljs-title, /* --- used for PureBASIC Procedures Names --- */ +.hljs-tag, +.hljs-variable, +.hljs-code { + color: #006666; /* Blue Stone (approx.) */ +} + +.hljs-keyword, /* --- used for PureBASIC Keywords --- */ +.hljs-class, +.hljs-meta-keyword, +.hljs-selector-class, +.hljs-built_in, +.hljs-builtin-name { + color: #006666; /* Blue Stone (approx.) */ + font-weight: bold; +} + +.hljs-string, /* --- used for PureBASIC Strings --- */ +.hljs-selector-attr { + color: #0080FF; /* Azure Radiance (approx.) */ +} + +.hljs-symbol, /* --- used for PureBASIC Constants --- */ +.hljs-link, +.hljs-deletion, +.hljs-attribute { + color: #924B72; /* Cannon Pink (approx.) */ +} + +.hljs-meta, +.hljs-literal, +.hljs-selector-id { + color: #924B72; /* Cannon Pink (approx.) */ + font-weight: bold; +} + +.hljs-strong, +.hljs-name { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/qtcreator_dark.css b/src/ASPNETHandler/DemoApp/styles/qtcreator_dark.css new file mode 100644 index 000000000..7aa56a365 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/qtcreator_dark.css @@ -0,0 +1,83 @@ +/* + +Qt Creator dark color scheme + +*/ + + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000000; +} + +.hljs, +.hljs-subst, +.hljs-tag, +.hljs-title { + color: #aaaaaa; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal { + color: #ff55ff; +} + +.hljs-code +.hljs-selector-class { + color: #aaaaff; +} + +.hljs-emphasis, +.hljs-stronge, +.hljs-type { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-function, +.hljs-section, +.hljs-symbol, +.hljs-name { + color: #ffff55; +} + +.hljs-attribute { + color: #ff5555; +} + +.hljs-variable, +.hljs-params, +.hljs-class .hljs-title { + color: #8888ff; +} + +.hljs-string, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition, +.hljs-link { + color: #ff55ff; +} + +.hljs-comment, +.hljs-meta, +.hljs-deletion { + color: #55ffff; +} diff --git a/src/ASPNETHandler/DemoApp/styles/qtcreator_light.css b/src/ASPNETHandler/DemoApp/styles/qtcreator_light.css new file mode 100644 index 000000000..1efa2c660 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/qtcreator_light.css @@ -0,0 +1,83 @@ +/* + +Qt Creator light color scheme + +*/ + + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #ffffff; +} + +.hljs, +.hljs-subst, +.hljs-tag, +.hljs-title { + color: #000000; +} + +.hljs-strong, +.hljs-emphasis { + color: #000000; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal { + color: #000080; +} + +.hljs-code +.hljs-selector-class { + color: #800080; +} + +.hljs-emphasis, +.hljs-stronge, +.hljs-type { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-function, +.hljs-section, +.hljs-symbol, +.hljs-name { + color: #808000; +} + +.hljs-attribute { + color: #800000; +} + +.hljs-variable, +.hljs-params, +.hljs-class .hljs-title { + color: #0055AF; +} + +.hljs-string, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-template-tag, +.hljs-template-variable, +.hljs-addition, +.hljs-link { + color: #008000; +} + +.hljs-comment, +.hljs-meta, +.hljs-deletion { + color: #008000; +} diff --git a/src/ASPNETHandler/DemoApp/styles/railscasts.css b/src/ASPNETHandler/DemoApp/styles/railscasts.css new file mode 100644 index 000000000..008cdc5bf --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/railscasts.css @@ -0,0 +1,106 @@ +/* + +Railscasts-like style (c) Visoft, Inc. (Damien White) + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #232323; + color: #e6e1dc; +} + +.hljs-comment, +.hljs-quote { + color: #bc9458; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #c26230; +} + +.hljs-string, +.hljs-number, +.hljs-regexp, +.hljs-variable, +.hljs-template-variable { + color: #a5c261; +} + +.hljs-subst { + color: #519f50; +} + +.hljs-tag, +.hljs-name { + color: #e8bf6a; +} + +.hljs-type { + color: #da4939; +} + + +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-builtin-name, +.hljs-attr, +.hljs-link { + color: #6d9cbe; +} + +.hljs-params { + color: #d0d0ff; +} + +.hljs-attribute { + color: #cda869; +} + +.hljs-meta { + color: #9b859d; +} + +.hljs-title, +.hljs-section { + color: #ffc66d; +} + +.hljs-addition { + background-color: #144212; + color: #e6e1dc; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #600; + color: #e6e1dc; + display: inline-block; + width: 100%; +} + +.hljs-selector-class { + color: #9b703f; +} + +.hljs-selector-id { + color: #8b98ab; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/src/ASPNETHandler/DemoApp/styles/rainbow.css b/src/ASPNETHandler/DemoApp/styles/rainbow.css new file mode 100644 index 000000000..905eb8ef1 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/rainbow.css @@ -0,0 +1,85 @@ +/* + +Style with support for rainbow parens + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #474949; + color: #d1d9e1; +} + + +.hljs-comment, +.hljs-quote { + color: #969896; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-type, +.hljs-addition { + color: #cc99cc; +} + +.hljs-number, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #f99157; +} + +.hljs-string, +.hljs-doctag, +.hljs-regexp { + color: #8abeb7; +} + +.hljs-title, +.hljs-name, +.hljs-section, +.hljs-built_in { + color: #b5bd68; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-selector-id, +.hljs-class .hljs-title { + color: #ffcc66; +} + +.hljs-section, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-link { + color: #f99157; +} + +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-attr, +.hljs-attribute { + color: #81a2be; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/routeros.css b/src/ASPNETHandler/DemoApp/styles/routeros.css new file mode 100644 index 000000000..ebe23990d --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/routeros.css @@ -0,0 +1,108 @@ +/* + + highlight.js style for Microtik RouterOS script + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #F0F0F0; +} + +/* Base color: saturation 0; */ + +.hljs, +.hljs-subst { + color: #444; +} + +.hljs-comment { + color: #888888; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-meta-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; +} + +.hljs-attribute { + color: #0E9A00; +} + +.hljs-function { + color: #99069A; +} + +.hljs-builtin-name { + color: #99069A; +} + +/* User color: hue: 0 */ + +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #BC6060; +} + + +/* Language color: hue: 90; */ + +.hljs-literal { + color: #78A960; +} + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #0C9A9A; +} + + +/* Meta color: hue: 200 */ + +.hljs-meta { + color: #1f7199; +} + +.hljs-meta-string { + color: #4d99bf; +} + + +/* Misc effects */ + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/school-book.css b/src/ASPNETHandler/DemoApp/styles/school-book.css new file mode 100644 index 000000000..964b51d84 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/school-book.css @@ -0,0 +1,72 @@ +/* + +School Book style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 15px 0.5em 0.5em 30px; + font-size: 11px; + line-height:16px; +} + +pre{ + background:#f6f6ae url(./school-book.png); + border-top: solid 2px #d2e8b9; + border-bottom: solid 1px #d2e8b9; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst { + color: #3e5915; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute, +.hljs-built_in, +.hljs-builtin-name, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable, +.hljs-link { + color: #2c009f; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #e60415; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-name, +.hljs-selector-id, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/school-book.png b/src/ASPNETHandler/DemoApp/styles/school-book.png new file mode 100644 index 000000000..956e9790a Binary files /dev/null and b/src/ASPNETHandler/DemoApp/styles/school-book.png differ diff --git a/src/ASPNETHandler/DemoApp/styles/solarized-dark.css b/src/ASPNETHandler/DemoApp/styles/solarized-dark.css new file mode 100644 index 000000000..b4c0da1f7 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/solarized-dark.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #002b36; + color: #839496; +} + +.hljs-comment, +.hljs-quote { + color: #586e75; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #073642; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/solarized-light.css b/src/ASPNETHandler/DemoApp/styles/solarized-light.css new file mode 100644 index 000000000..fdcfcc72c --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/solarized-light.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/sunburst.css b/src/ASPNETHandler/DemoApp/styles/sunburst.css new file mode 100644 index 000000000..f56dd5e9b --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/sunburst.css @@ -0,0 +1,102 @@ +/* + +Sunburst-like style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #000; + color: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #aeaeae; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #e28964; +} + +.hljs-string { + color: #65b042; +} + +.hljs-subst { + color: #daefa3; +} + +.hljs-regexp, +.hljs-link { + color: #e9c062; +} + +.hljs-title, +.hljs-section, +.hljs-tag, +.hljs-name { + color: #89bdff; +} + +.hljs-class .hljs-title, +.hljs-doctag { + text-decoration: underline; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-number { + color: #3387cc; +} + +.hljs-params, +.hljs-variable, +.hljs-template-variable { + color: #3e87e3; +} + +.hljs-attribute { + color: #cda869; +} + +.hljs-meta { + color: #8996a8; +} + +.hljs-formula { + background-color: #0e2231; + color: #f8f8f8; + font-style: italic; +} + +.hljs-addition { + background-color: #253b22; + color: #f8f8f8; +} + +.hljs-deletion { + background-color: #420e09; + color: #f8f8f8; +} + +.hljs-selector-class { + color: #9b703f; +} + +.hljs-selector-id { + color: #8b98ab; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-blue.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-blue.css new file mode 100644 index 000000000..78e59cc8c --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-blue.css @@ -0,0 +1,75 @@ +/* Tomorrow Night Blue Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #7285b7; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #ff9da4; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #ffc58f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #ffeead; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #d1f1a9; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #bbdaff; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #ebbbff; +} + +.hljs { + display: block; + overflow-x: auto; + background: #002451; + color: white; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-bright.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-bright.css new file mode 100644 index 000000000..e05af8ae2 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-bright.css @@ -0,0 +1,74 @@ +/* Tomorrow Night Bright Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #d54e53; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #e78c45; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #e7c547; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #b9ca4a; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #7aa6da; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #c397d8; +} + +.hljs { + display: block; + overflow-x: auto; + background: black; + color: #eaeaea; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night-eighties.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-eighties.css new file mode 100644 index 000000000..08fd51c74 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/tomorrow-night-eighties.css @@ -0,0 +1,74 @@ +/* Tomorrow Night Eighties Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #999999; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #f2777a; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f99157; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #ffcc66; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #99cc99; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #6699cc; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #cc99cc; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2d2d2d; + color: #cccccc; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow-night.css b/src/ASPNETHandler/DemoApp/styles/tomorrow-night.css new file mode 100644 index 000000000..ddd270a4e --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/tomorrow-night.css @@ -0,0 +1,75 @@ +/* Tomorrow Night Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #de935f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #b5bd68; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/tomorrow.css b/src/ASPNETHandler/DemoApp/styles/tomorrow.css new file mode 100644 index 000000000..026a62fe3 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/tomorrow.css @@ -0,0 +1,72 @@ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #8e908c; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #c82829; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5871f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #eab700; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #718c00; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #4271ae; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8959a8; +} + +.hljs { + display: block; + overflow-x: auto; + background: white; + color: #4d4d4c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/vs.css b/src/ASPNETHandler/DemoApp/styles/vs.css new file mode 100644 index 000000000..c5d07d311 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/vs.css @@ -0,0 +1,68 @@ +/* + +Visual Studio-like style based on original C# coloring by Jason Diamond + +*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-comment, +.hljs-quote, +.hljs-variable { + color: #008000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-built_in, +.hljs-name, +.hljs-tag { + color: #00f; +} + +.hljs-string, +.hljs-title, +.hljs-section, +.hljs-attribute, +.hljs-literal, +.hljs-template-tag, +.hljs-template-variable, +.hljs-type, +.hljs-addition { + color: #a31515; +} + +.hljs-deletion, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-meta { + color: #2b91af; +} + +.hljs-doctag { + color: #808080; +} + +.hljs-attr { + color: #f00; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #00b0e8; +} + + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/styles/vs2015.css b/src/ASPNETHandler/DemoApp/styles/vs2015.css new file mode 100644 index 000000000..d1d9be3ca --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/vs2015.css @@ -0,0 +1,115 @@ +/* + * Visual Studio 2015 dark style + * Author: Nicolas LLOBERA + */ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #1E1E1E; + color: #DCDCDC; +} + +.hljs-keyword, +.hljs-literal, +.hljs-symbol, +.hljs-name { + color: #569CD6; +} +.hljs-link { + color: #569CD6; + text-decoration: underline; +} + +.hljs-built_in, +.hljs-type { + color: #4EC9B0; +} + +.hljs-number, +.hljs-class { + color: #B8D7A3; +} + +.hljs-string, +.hljs-meta-string { + color: #D69D85; +} + +.hljs-regexp, +.hljs-template-tag { + color: #9A5334; +} + +.hljs-subst, +.hljs-function, +.hljs-title, +.hljs-params, +.hljs-formula { + color: #DCDCDC; +} + +.hljs-comment, +.hljs-quote { + color: #57A64A; + font-style: italic; +} + +.hljs-doctag { + color: #608B4E; +} + +.hljs-meta, +.hljs-meta-keyword, +.hljs-tag { + color: #9B9B9B; +} + +.hljs-variable, +.hljs-template-variable { + color: #BD63C5; +} + +.hljs-attr, +.hljs-attribute, +.hljs-builtin-name { + color: #9CDCFE; +} + +.hljs-section { + color: gold; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +/*.hljs-code { + font-family:'Monospace'; +}*/ + +.hljs-bullet, +.hljs-selector-tag, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #D7BA7D; +} + +.hljs-addition { + background-color: #144212; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #600; + display: inline-block; + width: 100%; +} diff --git a/src/ASPNETHandler/DemoApp/styles/xcode.css b/src/ASPNETHandler/DemoApp/styles/xcode.css new file mode 100644 index 000000000..43dddad84 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/xcode.css @@ -0,0 +1,93 @@ +/* + +XCode style (c) Angel Garcia + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fff; + color: black; +} + +.hljs-comment, +.hljs-quote { + color: #006a00; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal { + color: #aa0d91; +} + +.hljs-name { + color: #008; +} + +.hljs-variable, +.hljs-template-variable { + color: #660; +} + +.hljs-string { + color: #c41a16; +} + +.hljs-regexp, +.hljs-link { + color: #080; +} + +.hljs-title, +.hljs-tag, +.hljs-symbol, +.hljs-bullet, +.hljs-number, +.hljs-meta { + color: #1c00cf; +} + +.hljs-section, +.hljs-class .hljs-title, +.hljs-type, +.hljs-attr, +.hljs-built_in, +.hljs-builtin-name, +.hljs-params { + color: #5c2699; +} + +.hljs-attribute, +.hljs-subst { + color: #000; +} + +.hljs-formula { + background-color: #eee; + font-style: italic; +} + +.hljs-addition { + background-color: #baeeba; +} + +.hljs-deletion { + background-color: #ffc8bd; +} + +.hljs-selector-id, +.hljs-selector-class { + color: #9b703f; +} + +.hljs-doctag, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/ASPNETHandler/DemoApp/styles/xt256.css b/src/ASPNETHandler/DemoApp/styles/xt256.css new file mode 100644 index 000000000..58df82cb7 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/xt256.css @@ -0,0 +1,92 @@ + +/* + xt256.css + + Contact: initbar [at] protonmail [dot] ch + : github.com/initbar +*/ + +.hljs { + display: block; + overflow-x: auto; + color: #eaeaea; + background: #000; + padding: 0.5; +} + +.hljs-subst { + color: #eaeaea; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-builtin-name, +.hljs-type { + color: #eaeaea; +} + +.hljs-params { + color: #da0000; +} + +.hljs-literal, +.hljs-number, +.hljs-name { + color: #ff0000; + font-weight: bolder; +} + +.hljs-comment { + color: #969896; +} + +.hljs-selector-id, +.hljs-quote { + color: #00ffff; +} + +.hljs-template-variable, +.hljs-variable, +.hljs-title { + color: #00ffff; + font-weight: bold; +} + +.hljs-selector-class, +.hljs-keyword, +.hljs-symbol { + color: #fff000; +} + +.hljs-string, +.hljs-bullet { + color: #00ff00; +} + +.hljs-tag, +.hljs-section { + color: #000fff; +} + +.hljs-selector-tag { + color: #000fff; + font-weight: bold; +} + +.hljs-attribute, +.hljs-built_in, +.hljs-regexp, +.hljs-link { + color: #ff00ff; +} + +.hljs-meta { + color: #fff; + font-weight: bolder; +} diff --git a/src/ASPNETHandler/DemoApp/styles/zenburn.css b/src/ASPNETHandler/DemoApp/styles/zenburn.css new file mode 100644 index 000000000..07be50201 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/styles/zenburn.css @@ -0,0 +1,80 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #3f3f3f; + color: #dcdcdc; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-tag { + color: #e3ceab; +} + +.hljs-template-tag { + color: #dcdcdc; +} + +.hljs-number { + color: #8cd0d3; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute { + color: #efdcbc; +} + +.hljs-literal { + color: #efefaf; +} + +.hljs-subst { + color: #8f8f8f; +} + +.hljs-title, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-section, +.hljs-type { + color: #efef8f; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #dca3a3; +} + +.hljs-deletion, +.hljs-string, +.hljs-built_in, +.hljs-builtin-name { + color: #cc9393; +} + +.hljs-addition, +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #7f9f7f; +} + + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/ASPNETHandler/DemoApp/viewsrc.jpg b/src/ASPNETHandler/DemoApp/viewsrc.jpg new file mode 100644 index 000000000..98b37e43a Binary files /dev/null and b/src/ASPNETHandler/DemoApp/viewsrc.jpg differ diff --git a/src/ASPNETHandler/DemoApp/web.config b/src/ASPNETHandler/DemoApp/web.config new file mode 100644 index 000000000..3afa63324 --- /dev/null +++ b/src/ASPNETHandler/DemoApp/web.config @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ASPNETHandler/Dockerfile b/src/ASPNETHandler/Dockerfile new file mode 100644 index 000000000..70a939ce7 --- /dev/null +++ b/src/ASPNETHandler/Dockerfile @@ -0,0 +1,33 @@ +FROM mono + +MAINTAINER oscript.io team + +RUN apt-get update \ + && apt-get update \ + && apt-get install mono-devel apache2 libapache2-mod-mono mono-apache-server4 -y --no-install-recommends \ + && a2enmod mod_mono \ + && service apache2 stop \ + && apt-get autoremove -y \ + && apt-get clean \ + && rm -rf /var/tmp/* \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /etc/mono/registry /etc/mono/registry/LocalMachine \ + && sed -ri ' \ + s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ + s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \ + ' /etc/apache2/apache2.conf + +ADD ./nixconfig/apache2-site.conf /etc/apache2/sites-available/default + +RUN mkdir -p /srv/www/mono.localhost + +COPY ./bin/Debug/ /srv/www/mono.localhost +COPY ./nixconfig/Web.config /srv/www/mono.localhost + +RUN ls /srv/www/mono.localhost + +RUN /usr/bin/mod-mono-server4 --version + +WORKDIR /var/www +EXPOSE 80 +CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] \ No newline at end of file diff --git a/src/ASPNETHandler/HTTPServiceContext.cs b/src/ASPNETHandler/HTTPServiceContext.cs new file mode 100644 index 000000000..7f7256bac --- /dev/null +++ b/src/ASPNETHandler/HTTPServiceContext.cs @@ -0,0 +1,61 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; +using ScriptEngine.HostedScript.Library; +using ScriptEngine.HostedScript.Library.Binary; + +namespace ScriptEngine.HostedScript.Library.HTTPService +{ + [ContextClass("HTTPСервисКонтекст", "HTTPServiceContext")] + public class HTTPServiceContextImpl : AutoContext + { + System.Web.HttpContext _context; + SessionStateImpl _sessionState; + + public HTTPServiceContextImpl(System.Web.HttpContext context) + { + _context = context; + _sessionState = new SessionStateImpl(_context); + } + + [ContextProperty("ФизическийПуть", "PhysicalPath")] + public IValue PhysicalPath + { + get + { + return ValueFactory.Create(_context.Request.PhysicalPath); + } + } + + [ContextProperty("АдресКлиента", "UserHostAddress")] + public IValue UserHostAddress + { + get + { + return ValueFactory.Create(_context.Request.UserHostAddress); + } + } + + [ContextProperty("Сессия", "Session")] + public SessionStateImpl Session + { + get + { + return _sessionState; + } + } + + } +} diff --git a/src/ASPNETHandler/HTTPServiceRequest.cs b/src/ASPNETHandler/HTTPServiceRequest.cs new file mode 100644 index 000000000..601669aca --- /dev/null +++ b/src/ASPNETHandler/HTTPServiceRequest.cs @@ -0,0 +1,209 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; +using ScriptEngine.HostedScript.Library; +using ScriptEngine.HostedScript.Library.Binary; + +/// +/// +/// + +namespace ScriptEngine.HostedScript.Library.HTTPService +{ + /* HTTPСервисЗапрос + * Свойства: + + +HTTPМетод (HTTPMethod) + +БазовыйURL (BaseURL) + +Заголовки (Headers) + +ОтносительныйURL (RelativeURL) + +ПараметрыURL (URLParameters) + +ПараметрыЗапроса (QueryOptions) + + Методы: + + +ПолучитьТелоКакДвоичныеДанные (GetBodyAsBinaryData) + ПолучитьТелоКакПоток (GetBodyAsStream) + +ПолучитьТелоКакСтроку (GetBodyAsString) + + */ + [ContextClass("HTTPСервисЗапрос", "HTTPServiceRequest")] + public class HTTPServiceRequestImpl : AutoContext + { + System.Web.HttpContext _httpContext; + + FixedMapImpl _headers; + FixedMapImpl _urlParams; + FixedMapImpl _queryOptions; + HTTPServiceContextImpl _context; + + #region Свойства 1C + [ContextProperty("Контекст", "Context")] + public HTTPServiceContextImpl Context + { + get + { + return _context; + } + } + + + [ContextProperty("HTTPМетод", "HTTPMethod")] + public string HTTPMethod + { + get + { + return _httpContext.Request.HttpMethod.ToUpper(); + } + } + + [ContextProperty("БазовыйURL", "BaseURL")] + public string BaseURL + { + get + { + return _httpContext.Request.Url.Host; + } + } + + [ContextProperty("Заголовки", "Headers")] + public FixedMapImpl Headers + { + get + { + return _headers; + } + } + + [ContextProperty("ОтносительныйURL", "RelativeURL")] + public string RelativeURL + { + get + { + return _httpContext.Request.FilePath; + } + } + + [ContextProperty("ПараметрыURL", "URLParameters")] + public FixedMapImpl URLParameters + { + get + { + return _urlParams; + } + } + + [ContextProperty("ПараметрыЗапроса", "QueryOptions")] + public FixedMapImpl QueryOptions + { + get + { + return _queryOptions; + } + } + #endregion + + #region Методы1С + + [ContextMethod("ПолучитьТелоКакДвоичныеДанные", "GetBodyAsBinaryData")] + public BinaryDataContext GetBodyAsBinaryData() + { + System.IO.Stream str = _httpContext.Request.InputStream; + int bytes_count = Convert.ToInt32(str.Length); + byte[] buffer = new byte[bytes_count]; + str.Seek(0, System.IO.SeekOrigin.Begin); + str.Read(buffer, 0, bytes_count); + + return new BinaryDataContext(buffer); + } + + [ContextMethod("ПолучитьТелоКакСтроку", "GetBodyAsString")] + public string GetBodyAsString(IValue encoding = null) + { + // Формируем кодировку как в 1С. Если не указана, смотрим Content-Type. Если там не указана - используем UTF8 + System.Text.Encoding enc = System.Text.Encoding.UTF8; + + if (encoding != null) + enc = TextEncodingEnum.GetEncoding(encoding); + else + { + System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("charset=([^\\\"']+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase); + string charsetString = regex.Match(_httpContext.Request.ContentType).Value; + + if (charsetString != "") + { + // Что-то нашли + try + { + //charsetString.Substring(8) делает "charset=Кодировка" -> "Кодировка" + enc = TextEncodingEnum.GetEncodingByName(charsetString.Substring(8)); + } + catch + { + // что то не так, осталась UTF8 + } + } + } + + System.IO.Stream str = _httpContext.Request.InputStream; + int bytes_count = Convert.ToInt32(str.Length); + byte[] buffer = new byte[bytes_count]; + + str.Seek(0, System.IO.SeekOrigin.Begin); + str.Read(buffer, 0, bytes_count); + + return enc.GetString(buffer); + } + + //ПолучитьТелоКакПоток(GetBodyAsStream) + [ContextMethod("ПолучитьТелоКакПоток", "GetBodyAsStream")] + public GenericStream GetBodyAsStream() + { + return new GenericStream(_httpContext.Request.InputStream); + } + + #endregion + + public HTTPServiceRequestImpl(System.Web.HttpContext ctx) + { + _httpContext = ctx; + // Инициализируем объект для 1С + // Заголовки + MapImpl headers = new MapImpl(); + + for (int i = 0; i < _httpContext.Request.Headers.Count; i++) + headers.Insert(ValueFactory.Create(_httpContext.Request.Headers.GetKey(i)) + , ValueFactory.Create(_httpContext.Request.Headers.Get(i)) + ); + + this._headers = new FixedMapImpl(headers); + + // ПараметрыURL будут пустыми + _urlParams = new FixedMapImpl(new MapImpl()); + + // Параметры запроса + MapImpl queryOptions = new MapImpl(); + + for (int i = 0; i < _httpContext.Request.Params.Count; i++) + queryOptions.Insert(ValueFactory.Create(_httpContext.Request.Params.GetKey(i)) + , ValueFactory.Create(_httpContext.Request.Params.Get(i)) + ); + + _queryOptions = new FixedMapImpl(queryOptions); + + _context = new HTTPServiceContextImpl(_httpContext); + } + } +} \ No newline at end of file diff --git a/src/ASPNETHandler/HTTPServiceResponse.cs b/src/ASPNETHandler/HTTPServiceResponse.cs new file mode 100644 index 000000000..e133a1c57 --- /dev/null +++ b/src/ASPNETHandler/HTTPServiceResponse.cs @@ -0,0 +1,220 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; +using ScriptEngine.HostedScript.Library; +using ScriptEngine.HostedScript.Library.Binary; + +/// +/// +/// + +namespace ScriptEngine.HostedScript.Library.HTTPService +{ + /* + 8.3.10.2650 + + HTTPСервисОтвет (HTTPServiceResponseImpl) + + Свойства: + + +Заголовки (Headers) - Соответствие + +КодСостояния (StatusCode) - Целое + +Причина (Reason) - Строка + + Методы: + + +ПолучитьИмяФайлаТела (GetBodyFileName) + +ПолучитьТелоКакДвоичныеДанные (GetBodyAsBinaryData) + +ПолучитьТелоКакСтроку (GetBodyAsString) + +ПолучитьТелоКакПоток (GetBodyAsStream) + +УстановитьИмяФайлаТела (SetBodyFileName) + +УстановитьТелоИзДвоичныхДанных (SetBodyFromBinaryData) + +УстановитьТелоИзСтроки (SetBodyFromString) + + Конструкторы: + + +По коду состояния, причине и заголовкам + + ОТЛИЧИЯ: + При возврате потоков в несколько переменных, в 1С не обновляется текущее положение потока, + в настоящей реализации обновляется + */ + + [ContextClass("HTTPСервисОтвет", "HTTPServiceResponse")] + public class HTTPServiceResponseImpl : AutoContext + { + ScriptEngine.HostedScript.Library.MapImpl _headers = new HostedScript.Library.MapImpl(); + string _reason = ""; + int _statusCode = 200; + string _contentCharset = Encoding.UTF8.WebName; + + System.IO.Stream _bodyStream = new System.IO.MemoryStream(); + + public System.IO.Stream BodyStream + { + get + { + return _bodyStream; + } + } + + public string ContentCharset + { + get + { + return _contentCharset; + } + } + + public HTTPServiceResponseImpl() + { + } + + #region Свойства 1C + + [ContextProperty("Заголовки", "Headers")] + public MapImpl Headers + { + get + { + return _headers; + } + set + { + _headers = value; + } + } + + [ContextProperty("Причина", "Reason")] + public string Reason + { + get + { + return _reason; + } + set + { + _reason = value; + } + } + + [ContextProperty("КодСостояния", "StatusCode")] + public int StatusCode + { + get + { + return _statusCode; + } + set + { + _statusCode = value; + } + } + + #endregion + + #region Функции 1С + + [ContextMethod("ПолучитьИмяФайлаТела", "GetBodyFileName")] + public IValue GetBodyFileName() + { + if ((_bodyStream as System.IO.FileStream) == null) + return ValueFactory.Create(); + else + return ValueFactory.Create(((System.IO.FileStream)_bodyStream).Name); + } + + [ContextMethod("ПолучитьТелоКакДвоичныеДанные", "GetBodyAsBinaryData")] + public BinaryDataContext ПолучитьТелоКакДвоичныеДанные() + { + if ((_bodyStream as System.IO.MemoryStream) == null) + return null; + else + return new BinaryDataContext(((System.IO.MemoryStream)_bodyStream).GetBuffer()); + } + + [ContextMethod("ПолучитьТелоКакПоток", "GetBodyAsStream")] + public GenericStream GetBodyAsStream() + { + return new GenericStream(_bodyStream); + } + + [ContextMethod("ПолучитьТелоКакСтроку", "GetBodyAsString")] + public IValue GetBodyAsString() + { + if ((_bodyStream as System.IO.MemoryStream) == null) + return ValueFactory.Create(); + else + { + // Выяснено экспериментальным путем, используется UTF8 (8.3.10.2650) + return ValueFactory.Create(System.Text.Encoding.UTF8.GetString(((System.IO.MemoryStream)_bodyStream).GetBuffer())); + } + } + + [ContextMethod("УстановитьИмяФайлаТела", "SetBodyFileName")] + public void SetBodyFileName(IValue fileName) + { + _contentCharset = Encoding.UTF8.WebName; + _bodyStream = new System.IO.FileStream(fileName.AsString(), System.IO.FileMode.Open, System.IO.FileAccess.Read); + } + + [ContextMethod("УстановитьТелоИзДвоичныхДанных", "SetBodyFromBinaryData")] + public void SetBodyFromBinaryData(BinaryDataContext binaryData) + { + _contentCharset = Encoding.UTF8.WebName; + _bodyStream = new System.IO.MemoryStream(); + _bodyStream.Write(binaryData.Buffer, 0, binaryData.Buffer.Length); + _bodyStream.Seek(0, System.IO.SeekOrigin.Begin); + } + + [ContextMethod("УстановитьТелоИзСтроки", "SetBodyFromString")] + public void SetBodyFromString(string str, IValue encoding = null, IValue useBOM = null) + { + // Получаем кодировку + // useBOM должен иметь тип ИспользованиеByteOrderMark он не реализован. Его не используем + // Из синтаксис-помощника в режиме совместимости Использовать + // Из синтаксис помощника если кодировка не задана используем UTF8 + + System.Text.Encoding enc = System.Text.Encoding.UTF8; + if (encoding != null) + enc = TextEncodingEnum.GetEncoding(encoding); + + _contentCharset = enc.WebName; + + _bodyStream = new System.IO.MemoryStream(); + byte[] buffer = enc.GetBytes(str); + _bodyStream.Write(buffer, 0, buffer.Length); + _bodyStream.Seek(0, System.IO.SeekOrigin.Begin); + } + + [ScriptConstructor(Name = "По коду состояния, причине и заголовкам")] + public static IRuntimeContextInstance Constructor(IValue statusCode, IValue reason = null, MapImpl headers = null) + { + var response = new HTTPServiceResponseImpl(); + + response._statusCode = System.Convert.ToInt16(statusCode.AsNumber()); + + if (reason != null) + response._reason = reason.AsString(); + + if (headers != null) + response._headers = headers; + + return response; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/ASPNETHandler/HTTPServices.csproj b/src/ASPNETHandler/HTTPServices.csproj new file mode 100644 index 000000000..252700e19 --- /dev/null +++ b/src/ASPNETHandler/HTTPServices.csproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + {B7CD7F52-E387-490E-8F77-E1FB060401B5} + Library + Properties + ASPNETHandler + ASPNETHandler + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + {f09a46bd-5737-45e7-ba60-a47c9f7821a9} + ScriptEngine.HostedScript + + + {f062d1d9-d307-492a-a56b-ff3c55f8f6c0} + ScriptEngine + + + + + \ No newline at end of file diff --git a/src/ASPNETHandler/Properties/AssemblyInfo.cs b/src/ASPNETHandler/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..b01a149ef --- /dev/null +++ b/src/ASPNETHandler/Properties/AssemblyInfo.cs @@ -0,0 +1,43 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ASPNETHandler")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ASPNETHandler")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b7cd7f52-e387-490e-8f77-e1fb060401b5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/ASPNETHandler/SessionState.cs b/src/ASPNETHandler/SessionState.cs new file mode 100644 index 000000000..3658e0f16 --- /dev/null +++ b/src/ASPNETHandler/SessionState.cs @@ -0,0 +1,44 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; +using ScriptEngine.HostedScript.Library; +using ScriptEngine.HostedScript.Library.Binary; + +/// +/// +/// + +namespace ScriptEngine.HostedScript.Library.HTTPService +{ + [ContextClass("HTTPСервисПараметрыСессии", "HTTPServiceRequestSessionState")] + public class SessionStateImpl : AutoContext + { + System.Web.HttpContext _context; + + public SessionStateImpl(System.Web.HttpContext context) + { + _context = context; + } + + [ContextProperty("Количество", "Count")] + public IValue Count + { + get + { + return ValueFactory.Create(_context.Session.Count); + } + } + } +} diff --git a/src/ASPNETHandler/check-docker.sh b/src/ASPNETHandler/check-docker.sh new file mode 100755 index 000000000..1a9439ae2 --- /dev/null +++ b/src/ASPNETHandler/check-docker.sh @@ -0,0 +1,3 @@ +docker build -t oscript/http-service . + +docker run --rm -it -p 8080:80 oscript/http-service diff --git a/src/ASPNETHandler/nixconfig/Web.config b/src/ASPNETHandler/nixconfig/Web.config new file mode 100644 index 000000000..6f9b6ae07 --- /dev/null +++ b/src/ASPNETHandler/nixconfig/Web.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ASPNETHandler/nixconfig/apache2-site.conf b/src/ASPNETHandler/nixconfig/apache2-site.conf new file mode 100644 index 000000000..3a131d082 --- /dev/null +++ b/src/ASPNETHandler/nixconfig/apache2-site.conf @@ -0,0 +1,46 @@ + + ServerName mono.localhost + ServerAdmin web-admin@mono.localhost + DocumentRoot /srv/www/mono.localhost + # MonoServerPath can be changed to specify which version of ASP.NET is hosted + # mod-mono-server1 = ASP.NET 1.1 / mod-mono-server2 = ASP.NET 2.0 + # For SUSE Linux Enterprise Mono Extension, uncomment the line below: + # MonoServerPath mono.localhost "/opt/novell/mono/bin/mod-mono-server2" + # For Mono on openSUSE, uncomment the line below instead: + MonoServerPath mono.localhost "/usr/bin/mod-mono-server4" + + # To obtain line numbers in stack traces you need to do two things: + # 1) Enable Debug code generation in your page by using the Debug="true" + # page directive, or by setting in the + # application's Web.config + # 2) Uncomment the MonoDebug true directive below to enable mod_mono debugging + MonoDebug mono.localhost true + + # The MONO_IOMAP environment variable can be configured to provide platform abstraction + # for file access in Linux. Valid values for MONO_IOMAP are: + # case + # drive + # all + # Uncomment the line below to alter file access behavior for the configured application + MonoSetEnv mono.localhost MONO_IOMAP=all + # + # Additional environtment variables can be set for this server instance using + # the MonoSetEnv directive. MonoSetEnv takes a string of 'name=value' pairs + # separated by semicolons. For instance, to enable platform abstraction *and* + # use Mono's old regular expression interpreter (which is slower, but has a + # shorter setup time), uncomment the line below instead: + # MonoSetEnv mono.localhost MONO_IOMAP=all;MONO_OLD_RX=1 + + MonoApplications mono.localhost "/mono:/srv/www/mono.localhost" + + Allow from all + Order allow,deny + MonoSetServerAlias mono.localhost + SetHandler mono + SetOutputFilter DEFLATE + SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary + + + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript + + \ No newline at end of file diff --git a/src/DebugServer/DebugServer.csproj b/src/DebugServer/DebugServer.csproj index 3cafa34ca..2da0b9e35 100644 --- a/src/DebugServer/DebugServer.csproj +++ b/src/DebugServer/DebugServer.csproj @@ -48,6 +48,9 @@ + + GlobalAssemblyInfo.cs + @@ -68,6 +71,9 @@ Always + + Always + diff --git a/src/DebugServer/DebugeeProcess.cs b/src/DebugServer/DebugeeProcess.cs index 1a27ecdf9..6ae57a3e6 100644 --- a/src/DebugServer/DebugeeProcess.cs +++ b/src/DebugServer/DebugeeProcess.cs @@ -6,11 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; using System.Diagnostics; -using System.IO; -using System.Net.Sockets; -using System.Runtime.Serialization; -using System.Text; - using OneScript.DebugProtocol; using System.Collections.Generic; using System.Linq; @@ -58,7 +53,7 @@ public void Start() var psi = _process.StartInfo; psi.FileName = RuntimeExecutable; psi.UseShellExecute = false; - psi.Arguments = $"-debug {RuntimeArguments} {StartupScript} {ScriptArguments}"; + psi.Arguments = $"-debug {RuntimeArguments} \"{StartupScript}\" {ScriptArguments}"; psi.WorkingDirectory = WorkingDirectory; psi.RedirectStandardError = true; psi.RedirectStandardOutput = true; diff --git a/src/DebugServer/OscriptDebugSession.cs b/src/DebugServer/OscriptDebugSession.cs index 557db3f76..198f0bbf4 100644 --- a/src/DebugServer/OscriptDebugSession.cs +++ b/src/DebugServer/OscriptDebugSession.cs @@ -212,6 +212,14 @@ public override void SetBreakpoints(Response response, dynamic arguments) bpt.Source = path; breaks.Add(bpt); } + + if(breaks.Count == 0) // в целях сохранения интерфейса WCF придется сделать костыль на перех. период + { + var bpt = new OneScript.DebugProtocol.Breakpoint(); + bpt.Line = 0; + bpt.Source = path; + breaks.Add(bpt); + } var confirmedBreaks = _process.SetBreakpoints(breaks); var confirmedBreaksVSCode = new List(confirmedBreaks.Length); diff --git a/src/DebugServer/Properties/AssemblyInfo.cs b/src/DebugServer/Properties/AssemblyInfo.cs index 1f855ce90..fa433a4a2 100644 --- a/src/DebugServer/Properties/AssemblyInfo.cs +++ b/src/DebugServer/Properties/AssemblyInfo.cs @@ -13,10 +13,7 @@ This Source Code Form is subject to the terms of the // associated with an assembly. [assembly: AssemblyTitle("DebugServer")] [assembly: AssemblyDescription("1Script Debug Server for VS Code")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] [assembly: AssemblyProduct("1Script Debug Server")] -[assembly: AssemblyCopyright("Copyright EvilBeaver© 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -26,17 +23,4 @@ This Source Code Form is subject to the terms of the [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c979f151-aa29-47e4-b020-3039ba0986d9")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: Guid("c979f151-aa29-47e4-b020-3039ba0986d9")] \ No newline at end of file diff --git a/src/DebugServer/README.md b/src/DebugServer/README.md new file mode 100644 index 000000000..4e2c3743c --- /dev/null +++ b/src/DebugServer/README.md @@ -0,0 +1,17 @@ +# Сервер отладки 1Script + +Данное расширение предоставляет возможность отладки приложений 1Script. На данный момент находится в статусе ознакомительной версии. + +## Запуск отладки + +* Откройте папку с проектом oscript +* Нажмите F5 +* Будет создан файл launch.json с параметрами отладки. + +В файле launch.json можно задать несколько так называемых "профилей" отладки - наборов комбинаций параметров, под которым будет запускаться отлаживаемое приложение. + +Каждый профиль отладки представляет собой настройку запуска отлаживаемого приложения, его аргументы командной строки и версию интерпретатора 1script, которая будет выполнять приложение. + +### Подробное описание каждого параметра выводится при наведении мышки на опцию в файле launch.json. + +При возникновении вопросов напишите обращение на https://github.com/EvilBeaver/OneScript/issues. Мы обязательно вам поможем. \ No newline at end of file diff --git a/src/DebugServer/package.json b/src/DebugServer/package.json index 8c2ed5959..6904c9a95 100644 --- a/src/DebugServer/package.json +++ b/src/DebugServer/package.json @@ -1,7 +1,7 @@ { "name": "oscript-debug", "displayName": "OneScript Debug", - "version": "0.1.0", + "version": "0.2.0", "publisher": "EvilBeaver", "description": "Visual Studio Code debugger extension for OneScript", "icon": "images/mono-debug-icon.png", diff --git a/src/GlobalAssemblyInfo.cs b/src/GlobalAssemblyInfo.cs index 88e37b2bb..0628f6fd7 100644 --- a/src/GlobalAssemblyInfo.cs +++ b/src/GlobalAssemblyInfo.cs @@ -19,9 +19,9 @@ This Source Code Form is subject to the terms of the [assembly: AssemblyCompany("BeaverSoft")] [assembly: AssemblyCopyright("Copyright (c) 2017 EvilBeaver")] [assembly: AssemblyConfiguration("Commit 2a614c0")] -[assembly: AssemblyVersion("1.0.18.0")] -[assembly: AssemblyFileVersion("1.0.18.0")] -[assembly: AssemblyInformationalVersion("1.0.18.0")] +[assembly: AssemblyVersion("1.0.19.0")] +[assembly: AssemblyFileVersion("1.0.19.0")] +[assembly: AssemblyInformationalVersion("1.0.19.0")] internal sealed class ThisAssembly { @@ -31,11 +31,11 @@ internal sealed class ThisAssembly internal const string AssemblyConfiguration = "Commit 2a614c0"; - internal const string AssemblyVersion = "1.0.18.0"; + internal const string AssemblyVersion = "1.0.19.0"; - internal const string AssemblyFileVersion = "1.0.18.0"; + internal const string AssemblyFileVersion = "1.0.19.0"; - internal const string AssemblyInformationalVersion = "1.0.18.0"; + internal const string AssemblyInformationalVersion = "1.0.19.0"; private ThisAssembly() { diff --git a/src/NUnitTests/CompilerTests.cs b/src/NUnitTests/CompilerTests.cs new file mode 100644 index 000000000..130be5e42 --- /dev/null +++ b/src/NUnitTests/CompilerTests.cs @@ -0,0 +1,182 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System.IO; +using NUnit.Framework; +using ScriptEngine.Compiler; + +namespace NUnitTests +{ + [TestFixture] + public class CompilerTests + { + private EngineWrapperNUnit host; + + [OneTimeSetUp] + public void Init() + { + host = new EngineWrapperNUnit(); + host.StartEngine(); + var solutionRoot = Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", ".."); + host.Engine.InitExternalLibraries(Path.Combine(solutionRoot, "oscript-library", "src"), null); + } + + [Test] + public void TestNoSemicolonBeforeEndProcedure() + { + var moduleSource = host.Engine.Loader.FromString( + @"Процедура Проц1() + Возврат + КонецПроцедуры"); + + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + + [Test] + public void TestNoSemicolonBeforeEndFunction() + { + var moduleSource = host.Engine.Loader.FromString( + @"Функция Фун1() + Возврат 4 + КонецФункции"); + + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + + [Test] + public void TestNoSemicolonBeforeEndDo() + { + var moduleSource = host.Engine.Loader.FromString( + @"Для Инд = 1 По 10 Цикл + Прервать + КонецЕсли"); + + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + + [Test] + public void TestNoSemicolonBeforeEndIf() + { + var moduleSource = host.Engine.Loader.FromString( + @"Если Истина Тогда + Ф = 1 + ИначеЕсли Истина Тогда + Ф = 2 + Иначе + Ф = 3 + КонецЕсли"); + + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + + + [Test] + public void TestEndFunctionDoesNotEndIf() + { + var moduleSource = host.Engine.Loader.FromString( + @"Если Истина Тогда + Ф = 1 + КонецФункции"); + + bool exceptionThrown = false; + try + { + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + catch (CompilerException) + { + exceptionThrown = true; + } + Assert.IsTrue(exceptionThrown, "КонецФункции закрыл Если!!!"); + } + + [Test] + public void TestEndDoDoesNotEndIf() + { + var moduleSource = host.Engine.Loader.FromString( + @"Если Истина Тогда + Ф = 1 + КонецЦикла"); + + bool exceptionThrown = false; + try + { + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + catch (CompilerException) + { + exceptionThrown = true; + } + Assert.IsTrue(exceptionThrown, "КонецЦикла закрыл Если!!!"); + } + + [Test] + public void TestEndIfDoesNotEndDo() + { + var moduleSource = host.Engine.Loader.FromString( + @"Пока Истина Цикл + Ф = 1 + КонецЕсли"); + + bool exceptionThrown = false; + try + { + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + catch (CompilerException) + { + exceptionThrown = true; + } + Assert.IsTrue(exceptionThrown, "КонецЕсли закрыл Пока!!!"); + } + + [Test(Description = "Компилируется вызов метода с пропуском параметров")] + public void TestCompileMethodCallWithoutAllParams() + { + var moduleSource = host.Engine.Loader.FromString( + @"Функция Ф3(П1, П2, П3) + Возврат """" + П1 + П2 + П3 + КонецФункции + Функция Ф2(П1, П2, П3 = Неопределено) + Возврат """" + П1 + П2 + П3 + КонецФункции + Функция Ф1(П1, П2 = Неопределено, П3 = Неопределено) + Возврат """" + П1 + П2 + П3 + КонецФункции + Р = Ф3(,,); + Р = Ф2(,) + Ф2(,,); + Р = Ф1(,,) + Ф1(,); + "); + + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + + [Test(Description = "Не компилируется вызов метода вообще без параметров")] + public void TestCantCompileCallWithoutParams() + { + var moduleSource = host.Engine.Loader.FromString( + @"Функция Ф1(П1) + Возврат П1; + КонецФункции + Р = Ф1(); + "); + + bool exceptionThrown = false; + try + { + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + } + catch (CompilerException) + { + exceptionThrown = true; + } + Assert.IsTrue(exceptionThrown, "Не должно было скомпилироваться!"); + } + + + } +} \ No newline at end of file diff --git a/src/NUnitTests/ContextTests.cs b/src/NUnitTests/ContextTests.cs new file mode 100644 index 000000000..4053976e8 --- /dev/null +++ b/src/NUnitTests/ContextTests.cs @@ -0,0 +1,101 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using ScriptEngine; +using ScriptEngine.Machine; + +namespace NUnitTests +{ + [TestFixture] + public class ContextTests : ISystemLogWriter + { + private EngineWrapperNUnit host; + private readonly List _messages = new List(); + + [OneTimeSetUp] + public void Init() + { + host = new EngineWrapperNUnit(); + host.StartEngine(); + var solutionRoot = Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", ".."); + host.Engine.InitExternalLibraries(Path.Combine(solutionRoot, "oscript-library", "src"), null); + host.Engine.AttachAssembly(typeof(TestContextClass).Assembly); + } + + [Test] + public void TestICallDeprecatedAndHaveWarning() + { + SystemLogger.SetWriter(this); + _messages.Clear(); + host.RunTestString( + @"К = Новый ТестовыйКласс; + К.УстаревшийМетод(); + К.ObsoleteMethod(); + К.УстаревшийМетод();"); + + Assert.AreEqual(1, _messages.Count, "Только ОДНО предупреждение"); + Assert.IsTrue(_messages[0].IndexOf("УстаревшийМетод", StringComparison.InvariantCultureIgnoreCase) >= 0 + || _messages[0].IndexOf("ObsoleteMethod", StringComparison.InvariantCultureIgnoreCase) >= 0); + } + + [Test] + public void TestICallGoodAndHaveNoWarning() + { + SystemLogger.SetWriter(this); + _messages.Clear(); + host.RunTestString( + @"К = Новый ТестовыйКласс; + К.ХорошийМетод(); + К.GoodMethod();"); + + Assert.AreEqual(0, _messages.Count, "Нет предупреждений"); + } + + [Test] + public void TestICallDeprecatedAliasAndHaveWarning() + { + SystemLogger.SetWriter(this); + _messages.Clear(); + host.RunTestString( + @"К = Новый ТестовыйКласс; + К.ObsoleteAlias();"); + + Assert.AreEqual(1, _messages.Count, "Только ОДНО предупреждение"); + Assert.IsTrue(_messages[0].IndexOf("ObsoleteAlias", StringComparison.InvariantCultureIgnoreCase) >= 0); + } + + [Test] + public void TestICallDeprecatedAliasAndHaveException() + { + SystemLogger.SetWriter(this); + _messages.Clear(); + var exceptionThrown = false; + + try + { + host.RunTestString( + @"К = Новый ТестовыйКласс; + К.VeryObsoleteAlias();"); + } + catch (RuntimeException) + { + exceptionThrown = true; + } + Assert.IsTrue(exceptionThrown, "Безнадёжно устаревший метод должен вызвать исключение"); + } + + public void Write(string text) + { + _messages.Add(text); + } + + } +} \ No newline at end of file diff --git a/src/NUnitTests/EngineWrapperNUnit.cs b/src/NUnitTests/EngineWrapperNUnit.cs index b1663af63..2eb09099d 100644 --- a/src/NUnitTests/EngineWrapperNUnit.cs +++ b/src/NUnitTests/EngineWrapperNUnit.cs @@ -34,7 +34,13 @@ public HostedScriptEngine StartEngine() return Engine; } - + + public int RunTestString(string source) + { + var process = Engine.CreateProcess(this, Engine.Loader.FromString(source)); + return process.Start(); + } + private int RunTestScript(ICodeSource source, string resourceName) { var module = Engine.GetCompilerService().CreateModule(source); diff --git a/src/NUnitTests/NUnitTests.csproj b/src/NUnitTests/NUnitTests.csproj index 085f8e391..10c9a8ad3 100644 --- a/src/NUnitTests/NUnitTests.csproj +++ b/src/NUnitTests/NUnitTests.csproj @@ -57,7 +57,10 @@ + + + diff --git a/src/NUnitTests/TestContextClass.cs b/src/NUnitTests/TestContextClass.cs new file mode 100644 index 000000000..114ae147f --- /dev/null +++ b/src/NUnitTests/TestContextClass.cs @@ -0,0 +1,38 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; + +namespace NUnitTests +{ + [ContextClass("ТестовыйКласс", "TestClass")] + public class TestContextClass : AutoContext + { + + [ContextMethod("УстаревшийМетод", "ObsoleteMethod", isDeprecated: true)] + public void ObsoleteMethod() + { + // Do nothing + } + + [ContextMethod("ХорошийМетод", "GoodMethod")] + [ContextMethod("ObsoleteAlias", isDeprecated: true)] + [ContextMethod("VeryObsoleteAlias", isDeprecated: true, throwOnUse: true)] + public void GoodMethod() + { + // Do nothing + } + + [ScriptConstructor] + public static IRuntimeContextInstance Constructor() + { + return new TestContextClass(); + } + + } +} \ No newline at end of file diff --git a/src/NUnitTests/TestRunnerTest.cs b/src/NUnitTests/TestRunnerTest.cs index 5abd2172b..8d8ba75b7 100644 --- a/src/NUnitTests/TestRunnerTest.cs +++ b/src/NUnitTests/TestRunnerTest.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using System.IO; using NUnit.Framework; +using ScriptEngine.Machine; namespace NUnitTests { @@ -30,6 +31,28 @@ public void Initialize() host.Engine.InitExternalLibraries(Path.Combine(solutionRoot, "oscript-library", "src"), null); } + private void RunSpecificTest(string testName) + { + var testRunnerPath = Path.Combine(solutionRoot, "tests", "testrunner.os"); + + Assert.IsTrue(File.Exists(testRunnerPath), + "Запускатель тестов отсутствует по пути " + testRunnerPath); + + var specificTestPath = Path.Combine(solutionRoot, "tests", testName); + var result = host.RunTestScriptFromPath(testRunnerPath, $"-run {specificTestPath}"); + + if (result == TEST_STATE_FAILED) + { + Assert.Fail("Есть непройденные тесты!"); + } + } + + [Test] + public void Test_Reflector() + { + RunSpecificTest(@"reflector.os"); + } + [Test] [Ignore("Внутри валится очень много тестов, надо чинить механизм.")] public void RunEngineTests() @@ -44,5 +67,27 @@ public void RunEngineTests() if (result == TEST_STATE_FAILED) Assert.Fail("Есть непройденные тесты!"); } + + [Test] + public void CheckIKnowThisObject() + { + var moduleSource = host.Engine.Loader.FromString( + @"Перем А Экспорт; + Функция ФЭтотОбъект(Знач Который = 0) Экспорт + Возврат ?(Который = 0, ЭтотОбъект, ThisObject); + КонецФункции + A = 333;"); + var module = host.Engine.GetCompilerService().CreateModule(moduleSource); + var loadedModule = host.Engine.EngineInstance.LoadModuleImage(module); + var instance = host.Engine.EngineInstance.NewObject(loadedModule); + var methodIndex = instance.FindMethod("ФЭтотОбъект"); + + IValue asRus, asEng; + + instance.CallAsFunction(methodIndex, new[]{ValueFactory.Create(0)}, out asRus); + instance.CallAsFunction(methodIndex, new[]{ValueFactory.Create(1)}, out asEng); + + Assert.AreEqual(asRus, asEng); // Тот же самый объект + } } } \ No newline at end of file diff --git a/src/ScriptEngine.HostedScript/EngineConfigProvider.cs b/src/ScriptEngine.HostedScript/EngineConfigProvider.cs index 78b92f48e..6a77cdebf 100644 --- a/src/ScriptEngine.HostedScript/EngineConfigProvider.cs +++ b/src/ScriptEngine.HostedScript/EngineConfigProvider.cs @@ -88,12 +88,20 @@ private static void ExpandRelativePaths(Dictionary conf, string string sysDir = null; conf.TryGetValue(SYSTEM_LIB_KEY, out sysDir); + var confDir = System.IO.Path.GetDirectoryName(configFile); if (sysDir != null && !System.IO.Path.IsPathRooted(sysDir)) { - var confDir = System.IO.Path.GetDirectoryName(configFile); sysDir = System.IO.Path.GetFullPath(System.IO.Path.Combine(confDir, sysDir)); conf[SYSTEM_LIB_KEY] = sysDir; } + + string additionals; + if (conf.TryGetValue(ADDITIONAL_LIB_KEY, out additionals)) + { + var fullPaths = additionals.Split(new[]{";"}, StringSplitOptions.RemoveEmptyEntries) + .Select(x => Path.GetFullPath(Path.Combine(confDir, x))); + conf[ADDITIONAL_LIB_KEY] = String.Join(";",fullPaths); + } } private void ReadCustomConfig() diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index 9ec96cb23..14f10231a 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -10,9 +10,7 @@ This Source Code Form is subject to the terms of the using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; using System.Collections.Generic; -using System.Linq; -using OneScript.DebugProtocol; namespace ScriptEngine.HostedScript { @@ -174,7 +172,7 @@ public CompilerService GetCompilerService() InitializeDirectiveResolver(); var compilerSvc = _engine.GetCompilerService(); - compilerSvc.DefineVariable("ЭтотОбъект", SymbolType.ContextProperty); + compilerSvc.DefineVariable("ЭтотОбъект", "ThisObject", SymbolType.ContextProperty); return compilerSvc; } diff --git a/src/ScriptEngine.HostedScript/Library/Binary/BinaryDataBuffer.cs b/src/ScriptEngine.HostedScript/Library/Binary/BinaryDataBuffer.cs index d02623ae3..7f9c75e96 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/BinaryDataBuffer.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/BinaryDataBuffer.cs @@ -35,12 +35,8 @@ public BinaryDataBuffer(byte[] buffer, ByteOrderEnum byteOrder = ByteOrderEnum.L { _buffer = buffer; ByteOrder = byteOrder; - Converter = new EndianBitConverter(); - Converter.IsLittleEndian = byteOrder == ByteOrderEnum.LittleEndian; } - - private EndianBitConverter Converter { get; } - + // для операций с содержимым буфера внутри 1Script // public byte[] Bytes @@ -132,26 +128,29 @@ public void Write(int position, BinaryDataBuffer bytes, int number = 0) Array.Copy(bytes._buffer, _buffer, number); } - private byte[] GetBytes(Converter converterOverload, T value, IValue byteOrder = null) + private byte[] GetBytes(T value, Converter leConverter, Converter beConverter, IValue byteOrder = null) { - byte[] bytes; + ByteOrderEnum workByteOrder; if (byteOrder == null) - bytes = converterOverload(value); + workByteOrder = ByteOrder; else { + var enumVal = byteOrder.GetRawValue() as IObjectWrapper; + if (enumVal == null) + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); + try { - var order = (ByteOrderEnum)(object)byteOrder.GetRawValue(); - Converter.IsLittleEndian = order == ByteOrderEnum.LittleEndian; - bytes = converterOverload(value); + workByteOrder = (ByteOrderEnum)enumVal.UnderlyingObject; } catch (InvalidCastException) { - throw RuntimeException.InvalidArgumentType(); + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); } } - return bytes; + var converter = workByteOrder == ByteOrderEnum.BigEndian ? beConverter : leConverter; + return converter(value); } private void CopyBytes(int position, byte[] bytes) @@ -185,7 +184,7 @@ public void WriteInt16(int position, int value, IValue byteOrder = null) if (value < short.MinValue || value > short.MaxValue) throw RuntimeException.InvalidArgumentValue(); - var bytes = GetBytes(Converter.GetBytes, value, byteOrder); + var bytes = GetBytes(value, BitConversionFacility.LittleEndian.GetBytes, BitConversionFacility.BigEndian.GetBytes, byteOrder); CopyBytes(position, bytes); } @@ -207,7 +206,7 @@ public void WriteInt32(int position, int value, IValue byteOrder = null) { ThrowIfReadonly(); - var bytes = GetBytes(Converter.GetBytes, value, byteOrder); + var bytes = GetBytes(value, BitConversionFacility.LittleEndian.GetBytes, BitConversionFacility.BigEndian.GetBytes, byteOrder); CopyBytes(position, bytes); } @@ -234,7 +233,7 @@ public void WriteInt64(int position, long value, IValue byteOrder = null) { ThrowIfReadonly(); - var bytes = GetBytes(Converter.GetBytes, value, byteOrder); + var bytes = GetBytes(value, BitConversionFacility.LittleEndian.GetBytes, BitConversionFacility.BigEndian.GetBytes, byteOrder); CopyBytes(position, bytes); } @@ -317,17 +316,30 @@ public BinaryDataBuffer Read(int position, int number) Array.Copy(_buffer, position, data, 0, number); return new BinaryDataBuffer(data, ByteOrder); } - - - private T FromBytes(Func converterOverload, int position, IValue byteOrder = null) where T : struct + + private T FromBytes(int position, Func leConverter, Func beConverter, IValue byteOrder = null) { - ByteOrderEnum order = ByteOrder; - if (byteOrder != null) - order = ((CLREnumValueWrapper)byteOrder.GetRawValue()).UnderlyingValue; + ByteOrderEnum workByteOrder; + if (byteOrder == null) + workByteOrder = ByteOrder; + else + { + var enumVal = byteOrder.GetRawValue() as IObjectWrapper; + if (enumVal == null) + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); - Converter.IsLittleEndian = order == ByteOrderEnum.LittleEndian; + try + { + workByteOrder = (ByteOrderEnum)enumVal.UnderlyingObject; + } + catch (InvalidCastException) + { + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); + } + } - return converterOverload(_buffer, position); + var converter = workByteOrder == ByteOrderEnum.BigEndian ? beConverter : leConverter; + return converter(_buffer, position); } /// @@ -347,7 +359,7 @@ private T FromBytes(Func converterOverload, int position, IValu [ContextMethod("ПрочитатьЦелое16", "ReadInt16")] public int ReadInt16(int position, IValue byteOrder = null) { - return FromBytes(Converter.ToInt16, position, byteOrder); + return FromBytes(position, BitConversionFacility.LittleEndian.ToInt16, BitConversionFacility.BigEndian.ToInt16, byteOrder); } @@ -370,7 +382,7 @@ public int ReadInt16(int position, IValue byteOrder = null) [ContextMethod("ПрочитатьЦелое32", "ReadInt32")] public uint ReadInt32(int position, IValue byteOrder = null) { - return FromBytes(Converter.ToUInt32, position, byteOrder); + return FromBytes(position, BitConversionFacility.LittleEndian.ToUInt32, BitConversionFacility.BigEndian.ToUInt32, byteOrder); } @@ -393,7 +405,7 @@ public uint ReadInt32(int position, IValue byteOrder = null) [ContextMethod("ПрочитатьЦелое64", "ReadInt64")] public ulong ReadInt64(int position, IValue byteOrder = null) { - return FromBytes(Converter.ToUInt64, position, byteOrder); + return FromBytes(position, BitConversionFacility.LittleEndian.ToUInt64, BitConversionFacility.BigEndian.ToUInt64, byteOrder); } diff --git a/src/ScriptEngine.HostedScript/Library/Binary/BitConversionFacility.cs b/src/ScriptEngine.HostedScript/Library/Binary/BitConversionFacility.cs new file mode 100644 index 000000000..defd38dc6 --- /dev/null +++ b/src/ScriptEngine.HostedScript/Library/Binary/BitConversionFacility.cs @@ -0,0 +1,31 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ScriptEngine.HostedScript.Library.Binary +{ + public static class BitConversionFacility + { + static BitConversionFacility() + { + LittleEndian = new EndianBitConverter() + { + IsLittleEndian = true + }; + + BigEndian = new EndianBitConverter(); + } + + public static EndianBitConverter LittleEndian { get; set; } + public static EndianBitConverter BigEndian { get; set; } + } +} diff --git a/src/ScriptEngine.HostedScript/Library/Binary/DataReader.cs b/src/ScriptEngine.HostedScript/Library/Binary/DataReader.cs index b55ca7a84..6824072a5 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/DataReader.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/DataReader.cs @@ -6,617 +6,610 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; -using ScriptEngine.Machine; -using ScriptEngine.Machine.Contexts; +using System.IO; using System.Text; -using ScriptEngine.HostedScript.Library.Binary; - -/// -/// -/// Объект предназначен для чтения различных типов данных из источника данных. В качестве источника могут выступать Поток, Файл или ДвоичныеДанные. -/// Необходимо соблюдать следующий порядок работы с данным объектом: -/// -/// - Создать объект ЧтениеДанных на основании источника данных. -/// - Выполнить требуемые действия с помощью объекта. -/// - Закрыть экземпляр объекта ЧтениеДанных. -/// При необходимости использовать другие методы для работы с источником данных, требуется сначала закрыть экземпляр объекта ЧтениеДанных с помощью метода Закрыть, выполнить необходимые действия над источником, установить требуемую позицию для чтения из источника и создать новый экземпляр ЧтениеДанных. -/// -[ContextClass("ЧтениеДанных", "DataReader")] -class DataReader : AutoContext -{ - - private readonly Encoding _textEncoding; - private string _convertibleSplitterOfLines; - private ByteOrderEnum _byteOrder; - private string _lineSplitter; - private bool _ReadCompleted; - - public DataReader(IStreamWrapper streamImpl) - { - } +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; +namespace ScriptEngine.HostedScript.Library.Binary +{ /// /// - /// Создает объект для чтения из заданного объекта ДвоичныеДанные. - /// После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие. - /// - /// - /// - /// Экземпляр объекта ДвоичныеДанные, из которого будет выполнено чтение. - /// - /// Определяет кодировку текста, используемую для чтения данных. По-умолчанию используется кодировка UTF-8. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// - /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// Порядок байтов, используемый для декодирования целых чисел при чтении из потока. - /// Значение по умолчанию: LittleEndian. - /// - /// Определяет строку, разделяющую строки в двоичных данных. - /// Значение по умолчанию: Неопределено. - /// - /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. - /// Значение по умолчанию: ВК + ПС. - [ScriptConstructor(Name = "На основании двоичных данных")] - public static IRuntimeContextInstance Constructor(IValue binaryData, IValue textEncoding = null, IValue byteOrder = null, string lineSplitter = null, string convertibleSplitterOfLines = null) - { - throw new NotImplementedException(); - } - - /// - /// - /// Создает объект чтения из заданного файла. - /// При этом будет файл, указанный в параметре ИмяФайла, будет автоматически открыт на чтение. - /// Если файл с таким именем не существует, будет сгенерировано исключение. - /// - /// После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие. При этом файл, указанный в параметре <ИмяФайла>, будет автоматически закрыт. - /// - /// - /// - /// Имя файла, из которого будет выполнено чтение данных. - /// - /// Определяет кодировку текста, используемую для чтения файла. По-умолчанию используется кодировка UTF-8. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// Порядок байтов, используемый для декодирования целых чисел при чтении из потока. - /// Значение по умолчанию: LittleEndian. - /// - /// Строка, используемая в качестве разделителя строки в файле. - /// Значение по умолчанию: Неопределено. - /// - /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. - /// Значение по умолчанию: ВК + ПС. - [ScriptConstructor(Name = "На основании имени файла")] - public static IRuntimeContextInstance Constructor(string fileName, IValue textEncoding = null, IValue byteOrder = null, string lineSplitter = null, string convertibleSplitterOfLines = null) - { - throw new NotImplementedException(); - } - - /// + /// Объект предназначен для чтения различных типов данных из источника данных. В качестве источника могут выступать Поток, Файл или ДвоичныеДанные. + /// Необходимо соблюдать следующий порядок работы с данным объектом: /// - /// Создает объект чтения из данного потока. - /// После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие. + /// - Создать объект ЧтениеДанных на основании источника данных. + /// - Выполнить требуемые действия с помощью объекта. + /// - Закрыть экземпляр объекта ЧтениеДанных. + /// При необходимости использовать другие методы для работы с источником данных, требуется сначала закрыть экземпляр объекта ЧтениеДанных с помощью метода Закрыть, выполнить необходимые действия над источником, установить требуемую позицию для чтения из источника и создать новый экземпляр ЧтениеДанных. /// - /// - /// - /// Поток, из которого будет производиться чтение данных. Типы: Поток (Stream), ПотокВПамяти (MemoryStream), ФайловыйПоток (FileStream) - /// - /// Определяет кодировку текста, используемую для чтения данных. По-умолчанию используется кодировка UTF-8. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// Порядок байтов, используемый для декодирования целых чисел при чтении из потока. - /// Значение по умолчанию: LittleEndian. - /// - /// Определяет строку, разделяющую строки в потоке. - /// Значение по умолчанию: Неопределено. - /// - /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. - /// Значение по умолчанию: ВК + ПС. - [ScriptConstructor(Name = "На основании потока")] - public static IRuntimeContextInstance Constructor1(IValue stream, IValue textEncoding = null, IValue byteOrder = null, string lineSplitter = null, string convertibleSplitterOfLines = null) + [ContextClass("ЧтениеДанных", "DataReader")] + public class DataReader : AutoContext, IDisposable { - throw new NotImplementedException(); - } - - /// - /// - /// Кодировка текста, используемая по-умолчанию для данного экземпляра ЧтениеДанных. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// - [ContextProperty("КодировкаТекста", "TextEncoding")] - public ByteOrderEnum TextEncoding { get; set; } - - /// - /// - /// Конвертируемый разделитель строк. Этот параметр влияет на поведение метода ПрочитатьСимволы. - /// - /// Строка (String) - [ContextProperty("КонвертируемыйРазделительСтрок", "ConvertibleSplitterOfLines")] - public string ConvertibleSplitterOfLines { get; set; } + private BinaryReader _reader; + + private Encoding _workingEncoding; + private IValue _userVisibleEncoding; + + private DataReader(Stream stream, IValue textEncoding, ByteOrderEnum? byteOrder, string lineSplitter, string convertibleSplitterOfLines) + { + TextEncoding = textEncoding; + ByteOrder = byteOrder ?? ByteOrderEnum.LittleEndian; + LineSplitter = lineSplitter ?? "\n"; + ConvertibleSplitterOfLines = convertibleSplitterOfLines ?? "\r\n"; + _reader = new BinaryReader(stream, _workingEncoding); + } + + /// + /// + /// Создает объект для чтения из заданного объекта ДвоичныеДанные. + /// После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие. + /// + /// + /// + /// Экземпляр объекта ДвоичныеДанные, из которого будет выполнено чтение. + /// + /// Определяет кодировку текста, используемую для чтения данных. По-умолчанию используется кодировка UTF-8. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// + /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// Порядок байтов, используемый для декодирования целых чисел при чтении из потока. + /// Значение по умолчанию: LittleEndian. + /// + /// Определяет строку, разделяющую строки в двоичных данных. + /// Значение по умолчанию: Неопределено. + /// + /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. + /// Значение по умолчанию: ВК + ПС. + [ScriptConstructor(Name = "На основании двоичных данных")] + public static IRuntimeContextInstance Constructor(BinaryDataContext binaryData, IValue textEncoding = null, ByteOrderEnum? byteOrder = null, string lineSplitter = null, string convertibleSplitterOfLines = null) + { + var stream = new MemoryStream(binaryData.Buffer); + return new DataReader(stream, textEncoding, byteOrder, lineSplitter, convertibleSplitterOfLines); + } + + /// + /// + /// Создает объект чтения из заданного файла. + /// При этом будет файл, указанный в параметре ИмяФайла, будет автоматически открыт на чтение. + /// Если файл с таким именем не существует, будет сгенерировано исключение. + /// + /// После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие. При этом файл, указанный в параметре <ИмяФайла>, будет автоматически закрыт. + /// + /// + /// + /// Имя файла, из которого будет выполнено чтение данных. + /// + /// Определяет кодировку текста, используемую для чтения файла. По-умолчанию используется кодировка UTF-8. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// Порядок байтов, используемый для декодирования целых чисел при чтении из потока. + /// Значение по умолчанию: LittleEndian. + /// + /// Строка, используемая в качестве разделителя строки в файле. + /// Значение по умолчанию: Неопределено. + /// + /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. + /// Значение по умолчанию: ВК + ПС. + [ScriptConstructor(Name = "На основании имени файла")] + public static IRuntimeContextInstance Constructor(string fileName, IValue textEncoding = null, ByteOrderEnum? byteOrder = null, string lineSplitter = null, string convertibleSplitterOfLines = null) + { + var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + return new DataReader(stream, textEncoding, byteOrder, lineSplitter, convertibleSplitterOfLines); + } + + /// + /// + /// Создает объект чтения из данного потока. + /// После завершения работы с объектом ЧтениеДанных до того, как будет закрыт поток, переданный в конструктор, объект следует закрыть с помощью метода Закрыть или НачатьЗакрытие. + /// + /// + /// + /// Поток, из которого будет производиться чтение данных. Типы: Поток (Stream), ПотокВПамяти (MemoryStream), ФайловыйПоток (FileStream) + /// + /// Определяет кодировку текста, используемую для чтения данных. По-умолчанию используется кодировка UTF-8. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// Порядок байтов, используемый для декодирования целых чисел при чтении из потока. + /// Значение по умолчанию: LittleEndian. + /// + /// Определяет строку, разделяющую строки в потоке. + /// Значение по умолчанию: Неопределено. + /// + /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. + /// Значение по умолчанию: ВК + ПС. + [ScriptConstructor(Name = "На основании потока")] + public static IRuntimeContextInstance Constructor1(IStreamWrapper stream, IValue textEncoding = null, ByteOrderEnum? byteOrder = null, string lineSplitter = null, string convertibleSplitterOfLines = null) + { + return new DataReader(stream.GetUnderlyingStream(), textEncoding, byteOrder, lineSplitter, convertibleSplitterOfLines); + } + + /// + /// + /// Кодировка текста, используемая по-умолчанию для данного экземпляра ЧтениеДанных. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// + [ContextProperty("КодировкаТекста", "TextEncoding")] + public IValue TextEncoding + { + get { return _userVisibleEncoding; } + set + { + if (value != null) + { + _workingEncoding = TextEncodingEnum.GetEncoding(value); + _userVisibleEncoding = value; + } + else + { + _workingEncoding = new UTF8Encoding(true); + _userVisibleEncoding = ValueFactory.Create("utf-8"); + } + } + } - /// - /// - /// Порядок байтов по умолчанию. - /// - /// ПорядокБайтов (ByteOrder) - [ContextProperty("ПорядокБайтов", "ByteOrder")] - public ByteOrderEnum ByteOrder { get; set; } + /// + /// + /// Конвертируемый разделитель строк. Этот параметр влияет на поведение метода ПрочитатьСимволы. + /// + /// Строка (String) + [ContextProperty("КонвертируемыйРазделительСтрок", "ConvertibleSplitterOfLines")] + public string ConvertibleSplitterOfLines { get; set; } - /// - /// - /// Разделитель строк по-умолчанию. Это свойство влияет на поведение метода ПрочитатьСтроку. - /// - /// Строка (String) - [ContextProperty("РазделительСтрок", "LineSplitter")] - public string LineSplitter { get; set; } + /// + /// + /// Порядок байтов по умолчанию. + /// + /// ПорядокБайтов (ByteOrder) + [ContextProperty("ПорядокБайтов", "ByteOrder")] + public ByteOrderEnum ByteOrder { get; set; } - /// - /// - /// Содержит признак того, что во входном потоке больше нет данных для чтения. Изначально устанавливается в значение Ложь. Если при очередном чтении было прочитано меньше данных, чем было запрошено, принимает значение Истина. - /// - /// Булево (Boolean) - [ContextProperty("ЧтениеЗавершено", "ReadCompleted")] - public bool ReadCompleted { get; private set; } + /// + /// + /// Разделитель строк по-умолчанию. Это свойство влияет на поведение метода ПрочитатьСтроку. + /// + /// Строка (String) + [ContextProperty("РазделительСтрок", "LineSplitter")] + public string LineSplitter { get; set; } - /// - /// - /// Вызов данного метода завершает работу с текущим объектом. Если объект является владельцем вложенного потока, поток также закрывается. - /// - /// - [ContextMethod("Закрыть", "Close")] - public void Close() - { - throw new NotImplementedException(); - } - - - /// - /// - /// Получает исходный поток, из которого выполняется чтение данных. - /// - /// - /// - /// - /// - /// - [ContextMethod("ИсходныйПоток", "SourceStream")] - public IValue SourceStream() - { - throw new NotImplementedException(); - } + /// + /// + /// Содержит признак того, что во входном потоке больше нет данных для чтения. Изначально устанавливается в значение Ложь. Если при очередном чтении было прочитано меньше данных, чем было запрошено, принимает значение Истина. + /// + /// Булево (Boolean) + [ContextProperty("ЧтениеЗавершено", "ReadCompleted")] + public bool ReadCompleted + { + // TODO: будет падать на непозиционируемых потоках + get { return _reader.BaseStream.Position >= _reader.BaseStream.Length; } + } - /// - /// - /// Пропускает при чтении указанное количество байтов в потоке. - /// - /// - /// - /// Количество байтов, которые требуется пропустить. - /// - /// - /// - /// - [ContextMethod("Пропустить", "Skip")] - public int Skip(int number) - { - throw new NotImplementedException(); - } - - /// - /// - /// Пропускает при чтении двоичные данные до указанного разделителя. - /// - /// - /// - /// - /// Пропуск до двоичного маркера - /// - /// - /// - /// Маркер, до которого требуется пропустить данные. - /// - /// - /// - [ContextMethod("ПропуститьДо", "SkipTo")] - public int SkipTo(IValue marker) - { - throw new NotImplementedException(); - } - - /// - /// - /// Пропускает при чтении двоичные данные до указанного разделителя. - /// - /// - /// - /// - /// Пропуск до строкового маркера - /// - /// - /// - /// Маркер, до которого требуется пропустить данные. - /// - /// Кодировка текста. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// - /// - [ContextMethod("ПропуститьДо", "SkipTo")] - public int SkipTo(string marker, IValue encoding = null) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Пропускает при чтении двоичные данные до указанного разделителя. - /// - /// - /// - /// - /// Пропуск до смешанного набора маркеров - /// - /// - /// - /// Массив маркеров, до которых надо пропустить данные. Элементы массива могут иметь тип БуферДвоичныхДанных или Строка. - /// Данные пропускаются до первого встреченного маркера наибольшей возможной длины. - /// - /// Кодировка текста. - /// - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - [ContextMethod("ПропуститьДо", "SkipTo")] - public int SkipTo(IValue markers, IValue encoding = null) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Выполняет чтение двоичных данных заданного размера из потока. Если размер не указан, будут прочитаны все данные до конца потока. - /// - /// - /// - /// Количество байтов, которые требуется прочитать. Если не задано, то выполняется чтение всех данных до конца потока. - /// Значение по умолчанию: Неопределено. - /// - /// - /// Содержит описание результата чтения данных из потока. - /// - [ContextMethod("Прочитать", "Read")] - public IValue Read(int number = 0) - { - throw new NotImplementedException(); - } + /// + /// + /// Вызов данного метода завершает работу с текущим объектом. Если объект является владельцем вложенного потока, поток также закрывается. + /// + /// + [ContextMethod("Закрыть", "Close")] + public void Close() + { + _reader.Close(); + } + + + /// + /// + /// Получает исходный поток, из которого выполняется чтение данных. + /// + /// + /// + /// + /// + /// + [ContextMethod("ИсходныйПоток", "SourceStream")] + public IValue SourceStream() + { + return new GenericStream(_reader.BaseStream); + } - /// - /// - /// Выполняет чтение одного байта из потока. - /// - /// - /// - /// - [ContextMethod("ПрочитатьБайт", "ReadByte")] - public int ReadByte() - { - throw new NotImplementedException(); + /// + /// + /// Пропускает при чтении указанное количество байтов в потоке. + /// + /// + /// + /// Количество байтов, которые требуется пропустить. + /// + /// + /// + /// + [ContextMethod("Пропустить", "Skip")] + public long Skip(long number) + { + var stream = _reader.BaseStream; + if (stream.CanSeek) + { + long bytesSkipped; + var newPosition = stream.Position + number; + if (newPosition > stream.Length) + { + bytesSkipped = stream.Length - stream.Position; + stream.Seek(0, SeekOrigin.End); + } + else + { + stream.Position += number; + bytesSkipped = number; + } + + return bytesSkipped; + } + else + { + var buf = new byte[1024]; + var portion = (int)Math.Min(number, buf.Length); + long bytesSkipped = 0; + while (bytesSkipped < number) + { + var read = stream.Read(buf, 0, portion); + bytesSkipped += read; + if (read < portion) + break; + } + + return bytesSkipped; + } + } + + /// + /// + /// Пропускает при чтении двоичные данные до указанного разделителя. + /// + /// + /// + /// + /// Пропуск до двоичного маркера + /// + /// + /// + /// Маркер, до которого требуется пропустить данные. + /// + /// + /// + [ContextMethod("ПропуститьДо", "SkipTo")] + public int SkipTo(IValue marker) + { + throw new NotImplementedException(); + } + + /// + /// + /// Выполняет чтение двоичных данных заданного размера из потока. Если размер не указан, будут прочитаны все данные до конца потока. + /// + /// + /// + /// Количество байтов, которые требуется прочитать. Если не задано, то выполняется чтение всех данных до конца потока. + /// Значение по умолчанию: Неопределено. + /// + /// + /// Содержит описание результата чтения данных из потока. + /// + [ContextMethod("Прочитать", "Read")] + public ReadDataResult Read(int number = 0) + { + var src = ReadSomeBytes(number); + + return new ReadDataResult(src.ToArray()); + } + + private MemoryStream ReadSomeBytes(int number) + { + MemoryStream src; + if (number < 0) + throw RuntimeException.InvalidArgumentValue(); + + if (number == 0) + { + src = ReadAllData(); + } + else + { + var dest = new byte[number]; + var actual = _reader.Read(dest, 0, number); + src = new MemoryStream(dest, 0, actual); + } + return src; + } + + private MemoryStream ReadAllData() + { + var destStream = new MemoryStream(4096); + _reader.BaseStream.CopyTo(destStream); + destStream.Position = 0; + return destStream; + } + + /// + /// + /// Выполняет чтение одного байта из потока. + /// + /// + /// + /// + [ContextMethod("ПрочитатьБайт", "ReadByte")] + public byte ReadByte() + { + return _reader.ReadByte(); + } + + /// + /// + /// Прочитать байты из потока в БуферДвоичныхДанных. + /// + /// + /// + /// + /// Чтение в существующий буфер + /// + /// + /// + /// Буфер двоичных данных, в который требуется поместить прочитанные байты. + /// + /// Позиция в буфере, начиная с которой требуется записать прочитанные данные. + /// + /// Количество байтов, которые требуется прочитать. + /// + /// + /// + [ContextMethod("ПрочитатьВБуферДвоичныхДанных", "ReadIntoBinaryDataBuffer")] + public IValue ReadIntoBinaryDataBuffer(IValue buffer, int positionInBuffer = 0, int number = 0) + { + if (buffer.DataType == DataType.Number && positionInBuffer == 0 && number == 0) + { + var stream = ReadSomeBytes(number); + return new BinaryDataBuffer(stream.ToArray()); + } + else + { + var binBuffer = (BinaryDataBuffer)buffer.AsObject(); + var stream = ReadSomeBytes(number); + var bytesCount = number == 0 ? (int)stream.Length : number; + stream.Read(binBuffer.Bytes, positionInBuffer, bytesCount); + return buffer; + } + } + + + /// + /// + /// Выполняет чтение двоичных данных до указанного маркера. + /// + /// + /// + /// + /// Чтение до двоичного маркера + /// + /// + /// + /// Маркер, до которого выполняется чтение данных. + /// + /// + /// Содержит описание результата чтения данных из потока. + /// + [ContextMethod("ПрочитатьДо", "ReadTo")] + public IValue ReadTo(IValue marker) + { + throw new NotImplementedException(); + } + + /// + /// + /// Выполняет чтение заданного количества символов из потока в виде строки. Если количество символов не задано, выполняется чтение всего остатка потока. + /// + /// + /// + /// Количество символов, которые требуется прочитать. Если не установлено, то будут прочитаны все символы до конца потока. + /// Значение по умолчанию: Неопределено. + /// + /// Определяет кодировку текста. Если не установлена, используется кодировка, заданная для данного объекта ЧтениеДанных. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// + /// + [ContextMethod("ПрочитатьСимволы", "ReadChars")] + public string ReadChars(int count = 0, IValue encoding = null) + { + char[] chars; + if (encoding == null) + chars = _reader.ReadChars(count); + else + { + var bytes = _reader.ReadBytes(count * sizeof(char)); + var enc = TextEncodingEnum.GetEncoding(encoding); + chars = enc.GetChars(bytes); + } + + return new String(chars); + } + + /// + /// + /// Выполняет чтение строки текста до разделителя строки. Если разделитель не найден, чтение выполняется до конца потока. + /// Если разделитель строки не задан явно, используется разделитель строки, указанный для данного экземпляра объекта ЧтениеДанных. + /// + /// + /// + /// Кодировка текста. Если не установлена, используется кодировка, заданная для текущего экземпляра ЧтениеДанных. + /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// Указывает строку, являющуюся разделителем строк в читаемых данных. Если параметр не указан, используется разделитель строк, указанный для текущего экземпляра объекта ЧтениеДанных. + /// Значение по умолчанию: Неопределено. + /// + /// + /// + [ContextMethod("ПрочитатьСтроку", "ReadLine")] + public string ReadLine(IValue encoding = null, string lineSplitter = null) + { + var sr = new StreamReader(_reader.BaseStream); + var textRdr = new CustomLineFeedStreamReader(sr, lineSplitter, false); + return textRdr.ReadLine(lineSplitter ?? ConvertibleSplitterOfLines); + } + + private T FromBytes(byte[] bytes, Func leConverter, Func beConverter, IValue byteOrder = null) + { + ByteOrderEnum workByteOrder; + if (byteOrder == null) + workByteOrder = ByteOrder; + else + { + var enumVal = byteOrder.GetRawValue() as IObjectWrapper; + if (enumVal == null) + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); + + try + { + workByteOrder = (ByteOrderEnum)enumVal.UnderlyingObject; + } + catch (InvalidCastException) + { + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); + } + } + + var converter = workByteOrder == ByteOrderEnum.BigEndian ? beConverter : leConverter; + return converter(bytes, 0); + } + + /// + /// + /// Считывает 16-битное целое число из потока. + /// + /// + /// + /// Порядок байтов, используемый при чтении числа. + /// Если не задан, используется порядок, определенный для текущего экземпляра ЧтениеДанных. + /// Значение по умолчанию: Неопределено. + /// + /// + /// + [ContextMethod("ПрочитатьЦелое16", "ReadInt16")] + public int ReadInt16(IValue byteOrder = null) + { + var bytes = _reader.ReadBytes(sizeof(short)); + return FromBytes(bytes, BitConversionFacility.LittleEndian.ToInt16, BitConversionFacility.BigEndian.ToInt16, byteOrder); + } + + + /// + /// + /// Прочитать 32-битное целое число из потока. + /// + /// + /// + /// Порядок байтов, используемый при чтении числа. + /// Если не задан, используется порядок, определенный для текущего экземпляра ЧтениеДанных. + /// Значение по умолчанию: Неопределено. + /// + /// + /// Числовым типом может быть представлено любое десятичное число. Над данными числового типа определены основные арифметические операции: сложение, вычитание, умножение и деление. Максимально допустимая разрядность числа 38 знаков. + /// + [ContextMethod("ПрочитатьЦелое32", "ReadInt32")] + public uint ReadInt32(IValue byteOrder = null) + { + var bytes = _reader.ReadBytes(sizeof(uint)); + return FromBytes(bytes, BitConversionFacility.LittleEndian.ToUInt16, BitConversionFacility.BigEndian.ToUInt16, byteOrder); + } + + + /// + /// + /// Считывает 64-битное целое число из потока. + /// + /// + /// + /// Устанавливает порядок байтов, используя который число будет прочитано. Если порядок байтов не задан, то используется порядок байтов, определенный для текущего экземпляра ЧтениеДанных. + /// Значение по умолчанию: Неопределено. + /// + /// + /// Числовым типом может быть представлено любое десятичное число. Над данными числового типа определены основные арифметические операции: сложение, вычитание, умножение и деление. Максимально допустимая разрядность числа 38 знаков. + /// + [ContextMethod("ПрочитатьЦелое64", "ReadInt64")] + public ulong ReadInt64(IValue byteOrder = null) + { + var bytes = _reader.ReadBytes(sizeof(ulong)); + return FromBytes(bytes, BitConversionFacility.LittleEndian.ToUInt64, BitConversionFacility.BigEndian.ToUInt64, byteOrder); + } + + + /// + /// + /// Разделяет остаток данных по заданным разделителям. + /// + /// + /// + /// + /// По двоичному разделителю + /// + /// + /// + /// Двоичный разделитель данных. + /// + /// + /// + [ContextMethod("Разделить", "Split")] + public IValue Split(IValue separator) + { + throw new NotImplementedException(); + } + + + /// + /// + /// Разделяет остаток данных по заданным разделителям. + /// + /// + /// + /// + /// По строковому разделителю + /// + /// + /// + /// Разделитель данных в виде строки. + /// + /// Кодировка текста. Если не задана, то используется кодировка, заданная для текущего экземпляра объекта ЧтениеДанных. + /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// + /// + [ContextMethod("Разделить", "Split")] + public IValue Split(string separator, IValue encoding = null) + { + throw new NotImplementedException(); + } + + /// + /// + /// Разделяет остаток данных на части заданного размера. Размер части указывается в байтах. + /// + /// + /// + /// Размер части данных в байтах. + /// + /// + /// + [ContextMethod("РазделитьНаЧастиПо", "SplitInPartsOf")] + public IValue SplitInPartsOf(int partSizw) + { + throw new NotImplementedException(); + } + + public void Dispose() + { + _reader.Dispose(); + } } - - - /// - /// - /// Прочитать байты из потока в БуферДвоичныхДанных. - /// - /// - /// - /// - /// Чтение в новый буфер - /// - /// - /// - /// Количество байтов, которые требуется прочитать. Если не задано, то выполняется чтение всех байтов до конца потока. - /// Значение по умолчанию: Неопределено. - /// - /// - /// - [ContextMethod("ПрочитатьВБуферДвоичныхДанных", "ReadIntoBinaryDataBuffer")] - public IValue ReadIntoBinaryDataBuffer(int number = 0) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Прочитать байты из потока в БуферДвоичныхДанных. - /// - /// - /// - /// - /// Чтение в существующий буфер - /// - /// - /// - /// Буфер двоичных данных, в который требуется поместить прочитанные байты. - /// - /// Позиция в буфере, начиная с которой требуется записать прочитанные данные. - /// - /// Количество байтов, которые требуется прочитать. - /// - /// - /// - [ContextMethod("ПрочитатьВБуферДвоичныхДанных", "ReadIntoBinaryDataBuffer")] - public IValue ReadIntoBinaryDataBuffer(IValue buffer, int positionInBuffer, int number) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Выполняет чтение двоичных данных до указанного маркера. - /// - /// - /// - /// - /// Чтение до двоичного маркера - /// - /// - /// - /// Маркер, до которого выполняется чтение данных. - /// - /// - /// Содержит описание результата чтения данных из потока. - /// - [ContextMethod("ПрочитатьДо", "ReadTo")] - public IValue ReadTo(IValue marker) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Выполняет чтение двоичных данных до указанного маркера. - /// - /// - /// - /// - /// Чтение до строкового маркера - /// - /// - /// - /// Маркер, до которого выполняется чтение. - /// - /// Кодировка текста для определения строковых маркеров в двоичном потоке. - /// Если параметр не установлен, используется кодировка, указанная для текущего экземпляра ЧтениеДанных. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// - /// Содержит описание результата чтения данных из потока. - /// - [ContextMethod("ПрочитатьДо", "ReadTo")] - public IValue ReadTo(string marker, IValue encoding = null) - { - throw new NotImplementedException(); - } - - /// - /// - /// Выполняет чтение двоичных данных до указанного маркера. - /// - /// - /// - /// - /// Чтение до смешанного набора маркеров - /// - /// - /// - /// Массив, содержащий маркеры. Элементы массива могут иметь тип БуферДвоичныхДанных или Строка. - /// - /// Кодировка текста для определения строковых маркеров в двоичном потоке. - /// Если параметр не установлен, используется кодировка, указанная для текущего экземпляра ЧтениеДанных. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// - /// Содержит описание результата чтения данных из потока. - /// - [ContextMethod("ПрочитатьДо", "ReadTo")] - public IValue ReadTo(IValue markers, IValue encoding = null) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Выполняет чтение заданного количества символов из потока в виде строки. Если количество символов не задано, выполняется чтение всего остатка потока. - /// - /// - /// - /// Количество символов, которые требуется прочитать. Если не установлено, то будут прочитаны все символы до конца потока. - /// Значение по умолчанию: Неопределено. - /// - /// Определяет кодировку текста. Если не установлена, используется кодировка, заданная для данного объекта ЧтениеДанных. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// - /// - [ContextMethod("ПрочитатьСимволы", "ReadChars")] - public string ReadChars(int count = 0, IValue encoding = null) - { - throw new NotImplementedException(); - } - - /// - /// - /// Выполняет чтение строки текста до разделителя строки. Если разделитель не найден, чтение выполняется до конца потока. - /// Если разделитель строки не задан явно, используется разделитель строки, указанный для данного экземпляра объекта ЧтениеДанных. - /// - /// - /// - /// Кодировка текста. Если не установлена, используется кодировка, заданная для текущего экземпляра ЧтениеДанных. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// Указывает строку, являющуюся разделителем строк в читаемых данных. Если параметр не указан, используется разделитель строк, указанный для текущего экземпляра объекта ЧтениеДанных. - /// Значение по умолчанию: Неопределено. - /// - /// - /// - [ContextMethod("ПрочитатьСтроку", "ReadLine")] - public string ReadLine(IValue encoding = null, string lineSplitter = null) - { - throw new NotImplementedException(); - } - - /// - /// - /// Считывает 16-битное целое число из потока. - /// - /// - /// - /// Порядок байтов, используемый при чтении числа. - /// Если не задан, используется порядок, определенный для текущего экземпляра ЧтениеДанных. - /// Значение по умолчанию: Неопределено. - /// - /// - /// - [ContextMethod("ПрочитатьЦелое16", "ReadInt16")] - public int ReadInt16(IValue byteOrder = null) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Прочитать 32-битное целое число из потока. - /// - /// - /// - /// Порядок байтов, используемый при чтении числа. - /// Если не задан, используется порядок, определенный для текущего экземпляра ЧтениеДанных. - /// Значение по умолчанию: Неопределено. - /// - /// - /// Числовым типом может быть представлено любое десятичное число. Над данными числового типа определены основные арифметические операции: сложение, вычитание, умножение и деление. Максимально допустимая разрядность числа 38 знаков. - /// - [ContextMethod("ПрочитатьЦелое32", "ReadInt32")] - public int ReadInt32(IValue byteOrder = null) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Считывает 64-битное целое число из потока. - /// - /// - /// - /// Устанавливает порядок байтов, используя который число будет прочитано. Если порядок байтов не задан, то используется порядок байтов, определенный для текущего экземпляра ЧтениеДанных. - /// Значение по умолчанию: Неопределено. - /// - /// - /// Числовым типом может быть представлено любое десятичное число. Над данными числового типа определены основные арифметические операции: сложение, вычитание, умножение и деление. Максимально допустимая разрядность числа 38 знаков. - /// - [ContextMethod("ПрочитатьЦелое64", "ReadInt64")] - public int ReadInt64(IValue byteOrder = null) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Разделяет остаток данных по заданным разделителям. - /// - /// - /// - /// - /// По двоичному разделителю - /// - /// - /// - /// Двоичный разделитель данных. - /// - /// - /// - [ContextMethod("Разделить", "Split")] - public IValue Split(IValue separator) - { - throw new NotImplementedException(); - } - - - /// - /// - /// Разделяет остаток данных по заданным разделителям. - /// - /// - /// - /// - /// По строковому разделителю - /// - /// - /// - /// Разделитель данных в виде строки. - /// - /// Кодировка текста. Если не задана, то используется кодировка, заданная для текущего экземпляра объекта ЧтениеДанных. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// - /// - [ContextMethod("Разделить", "Split")] - public IValue Split(string separator, IValue encoding = null) - { - throw new NotImplementedException(); - } - - /// - /// - /// Разделяет остаток данных по заданным разделителям. - /// - /// - /// - /// - /// По набору смешанных разделителей - /// - /// - /// - /// Массив разделителей может содержать элементы типа БуферДвоичныхДанных или Строка. - /// - /// Кодировка текста. Если не установлена, используется кодировка, заданная для текущего экземпляра ЧтениеДанных. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// - /// - [ContextMethod("Разделить", "Split")] - public IValue Split(IValue separators, IValue encoding = null) - { - throw new NotImplementedException(); - } - - /// - /// - /// Разделяет остаток данных на части заданного размера. Размер части указывается в байтах. - /// - /// - /// - /// Размер части данных в байтах. - /// - /// - /// - [ContextMethod("РазделитьНаЧастиПо", "SplitInPartsOf")] - public IValue SplitInPartsOf(int partSizw) - { - throw new NotImplementedException(); - } - } diff --git a/src/ScriptEngine.HostedScript/Library/Binary/DataWriter.cs b/src/ScriptEngine.HostedScript/Library/Binary/DataWriter.cs index 43ccfee97..9ecd44e41 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/DataWriter.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/DataWriter.cs @@ -6,340 +6,433 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.IO; +using System.Text; + using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; - - -/// -/// -/// Объект предназначен для удобной записи различных типов данных в приемник. -/// Необходимо соблюдать следующий порядок работы с данным объектом: -/// -/// - Создать или получить приемник даных. -/// - Вызвать из приемника экземпляр объекта ЗаписьДанных. -/// - Выполнить требуемые действия с помощью объекта. -/// - Закрыть экземпляр объекта ЗаписьДанных. -/// При необходимости использовать другие методы для работы с данными, требуется сначала закрыть экземпляр объекта ЗаписьДанных с помощью метода Закрыть, выполнить необходимые действия над данными, установить требуемую позицию для чтения из приемника и создать новый экземпляр ЗаписьДанных. -/// -[ContextClass("ЗаписьДанных", "DataWriter")] -class DataWriter : AutoContext +namespace ScriptEngine.HostedScript.Library.Binary { - - private IValue _TextEncoding; - private string _ConvertibleSplitterOfLines; - private IValue _ByteOrder; - private string _LineSplitter; - /// /// - /// Создает объект ЗаписьДанных для записи в указанный файл. Если файл с таким именем не существует, он будет создан. Параметр <Дописать> определяет, будут ли данные записаны в начало или в конец файла. - /// После завершения работы с объектом, до закрытия потока, переданного в конструктор, объект необходимо закрыть с помощью метода Закрыть или НачатьЗакрытие. При этом используемый файл будет закрыт автоматически. - /// - /// - /// - /// Имя файла, в который будет выполнена запись. - /// - /// Кодировка текста для создаваемого экземпляра ЗаписьДанных. Если не задана, то используется UTF-8. - /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// Порядок байтов, используемый по умолчанию для кодирования целых чисел при записи в поток. - /// Значение по умолчанию: LittleEndian. - /// - /// Разделитель по умолчанию для строк, записываемых в поток. Если разделитель строк не задан, то используется строка ПС. - /// Значение по умолчанию: ПС. - /// - /// Определяет, будут ли данные записаны в начало или в конец файла: + /// Объект предназначен для удобной записи различных типов данных в приемник. + /// Необходимо соблюдать следующий порядок работы с данным объектом: /// - /// - Если Истина, то при открытии существующего файла запись будет выполнена в конец файла. - /// - Иначе данные будут записываться с начала файла, перезаписывая существующие данные. - /// Если заданный файл не существует, будет создан новый файл с указанным именем и значение параметра не повлияет на поведение конструктора. - /// Значение по умолчанию: Ложь. - /// - /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. - /// Значение по умолчанию: ВК + ПС. - /// - /// Если в начало файла или потока требуется записать метку порядка байтов (BOM) для используемой кодировки текста, то данный параметр должен иметь значение Истина. - /// Значение по умолчанию: Ложь. - /// - [ScriptConstructor(Name = "На основании имени файла")] - public static IRuntimeContextInstance Constructor(string fileName, IValue textEncoding = null, IValue byteOrder = null, string lineSplitter = null, bool append = false, string convertibleSplitterOfLines = null, bool writeBOM = false) - { - return new DataWriter(); - } - - /// - /// - /// Объект создается для записи в заданный поток. - /// После завершения работы с объектом, до закрытия потока, переданного в конструктор, объект необходимо закрыть с помощью метода Закрыть или НачатьЗакрытие. + /// - Создать или получить приемник даных. + /// - Вызвать из приемника экземпляр объекта ЗаписьДанных. + /// - Выполнить требуемые действия с помощью объекта. + /// - Закрыть экземпляр объекта ЗаписьДанных. + /// При необходимости использовать другие методы для работы с данными, требуется сначала закрыть экземпляр объекта ЗаписьДанных с помощью метода Закрыть, выполнить необходимые действия над данными, установить требуемую позицию для чтения из приемника и создать новый экземпляр ЗаписьДанных. /// - /// - /// - /// Поток, в который производится запись данных. Типы: Поток (Stream), ПотокВПамяти (MemoryStream), ФайловыйПоток (FileStream) - /// - /// Устанавливает кодировку текста для создаваемого экземпляра ЗаписьДанных. Если не задано, используется кодировка UTF-8. - /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// Порядок байтов, используемый по умолчанию для кодирования целых чисел при записи в поток. - /// Значение по умолчанию: LittleEndian. - /// - /// Разделитель по умолчанию для строк, записываемых в поток. Если разделитель строк не задан, то используется строка ПС. - /// Значение по умолчанию: ПС. - /// - /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. - /// Значение по умолчанию: ВК + ПС. - /// - /// Если в начало файла или потока требуется записать метку порядка байтов (BOM) для используемой кодировки текста, то данный параметр должен иметь значение Истина. - /// Значение по умолчанию: Ложь. - /// - [ScriptConstructor(Name = "На основании потока")] - public static IRuntimeContextInstance Constructor1(IValue stream, IValue textEncoding = null, IValue byteOrder = null, string lineSplitter = null, IValue convertibleSplitterOfLines = null, bool writeBOM = false) + [ContextClass("ЗаписьДанных", "DataWriter")] + public class DataWriter : AutoContext, IDisposable { - return new DataWriter(); - } - /// - /// - /// Кодировка текста по-умолчанию для данного экземпляра ЗаписьДанных. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// - /// КодировкаТекста (TextEncoding), Строка (String) - [ContextProperty("КодировкаТекста", "TextEncoding")] - public IValue TextEncoding { get; set; } + private Encoding _workingEncoding; + private IValue _userVisibleEncoding; + private BinaryWriter _binaryWriter; + private readonly bool _writeBOM; + + public DataWriter(string fileName, IValue textEncoding, ByteOrderEnum? byteOrder, string lineSplitter, bool append, string convertibleSplitterOfLines, bool writeBOM) + { + ByteOrder = byteOrder?? ByteOrderEnum.LittleEndian; + LineSplitter = lineSplitter?? "\r\n"; + ConvertibleSplitterOfLines = convertibleSplitterOfLines; + _writeBOM = writeBOM; + TextEncoding = textEncoding; - /// - /// - /// Конвертируемый разделитель строк. Этот параметр влияет на поведение метода ЗаписатьСимволы. - /// - /// Строка (String) - [ContextProperty("КонвертируемыйРазделительСтрок", "ConvertibleSplitterOfLines")] - public string ConvertibleSplitterOfLines { get; set; } + var fileSubsystem = new FileStreamsManager(); + var fileStreamContext = append ? fileSubsystem.OpenForAppend(fileName) : fileSubsystem.OpenForWrite(fileName); - /// - /// - /// Порядок байтов по умолчанию. - /// - /// ПорядокБайтов (ByteOrder) - [ContextProperty("ПорядокБайтов", "ByteOrder")] - public IValue ByteOrder { get; private set; } + _binaryWriter = new BinaryWriter(fileStreamContext.GetUnderlyingStream(), _workingEncoding); + + } + public DataWriter(IStreamWrapper streamObj, IValue textEncoding, ByteOrderEnum? byteOrder, string lineSplitter, string convertibleSplitterOfLines, bool writeBOM) + { + ByteOrder = byteOrder?? ByteOrderEnum.LittleEndian; + LineSplitter = lineSplitter ?? "\r\n"; + ConvertibleSplitterOfLines = convertibleSplitterOfLines; + _writeBOM = writeBOM; + TextEncoding = textEncoding; - /// - /// - /// Разделитель строк по-умолчанию. Это свойство влияет на поведение метода ЗаписатьСтроку. - /// - /// Строка (String) - [ContextProperty("РазделительСтрок", "LineSplitter")] - public string LineSplitter { get; set; } - - /// - /// - /// Вызывает метод СброситьБуферы. Если целевой поток был создан при создании объекта ЗаписьДанных, целевой поток также закрывается. - /// - /// - /// - [ContextMethod("Закрыть", "Close")] - public void Close() - { - throw new NotImplementedException(); - } + _binaryWriter = new BinaryWriter(streamObj.GetUnderlyingStream(), _workingEncoding); + + } + /// + /// + /// Создает объект ЗаписьДанных для записи в указанный файл. Если файл с таким именем не существует, он будет создан. Параметр <Дописать> определяет, будут ли данные записаны в начало или в конец файла. + /// После завершения работы с объектом, до закрытия потока, переданного в конструктор, объект необходимо закрыть с помощью метода Закрыть или НачатьЗакрытие. При этом используемый файл будет закрыт автоматически. + /// + /// + /// + /// Имя файла, в который будет выполнена запись. + /// + /// Кодировка текста для создаваемого экземпляра ЗаписьДанных. Если не задана, то используется UTF-8. + /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// Порядок байтов, используемый по умолчанию для кодирования целых чисел при записи в поток. + /// Значение по умолчанию: LittleEndian. + /// + /// Разделитель по умолчанию для строк, записываемых в поток. Если разделитель строк не задан, то используется строка ПС. + /// Значение по умолчанию: ПС. + /// + /// Определяет, будут ли данные записаны в начало или в конец файла: + /// + /// - Если Истина, то при открытии существующего файла запись будет выполнена в конец файла. + /// - Иначе данные будут записываться с начала файла, перезаписывая существующие данные. + /// Если заданный файл не существует, будет создан новый файл с указанным именем и значение параметра не повлияет на поведение конструктора. + /// Значение по умолчанию: Ложь. + /// + /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. + /// Значение по умолчанию: ВК + ПС. + /// + /// Если в начало файла или потока требуется записать метку порядка байтов (BOM) для используемой кодировки текста, то данный параметр должен иметь значение Истина. + /// Значение по умолчанию: Ложь. + /// + [ScriptConstructor(Name = "На основании имени файла")] + public static IRuntimeContextInstance Constructor(string fileName, IValue textEncoding = null, ByteOrderEnum? byteOrder = null, string lineSplitter = null, bool append = false, string convertibleSplitterOfLines = null, bool writeBOM = false) + { + return new DataWriter(fileName, textEncoding, byteOrder, lineSplitter, append, convertibleSplitterOfLines, writeBOM); + } - /// - /// - /// Записывает данные в целевой поток. - /// - /// - /// - /// - /// Запись двоичных данных - /// - /// - /// - /// Записать экземпляр объекта ДвоичныеДанные в поток. - /// - [ContextMethod("Записать", "Write")] - public void Write(IValue binaryDataOrReadResult) - { - throw new NotImplementedException(); - } + /// + /// + /// Объект создается для записи в заданный поток. + /// После завершения работы с объектом, до закрытия потока, переданного в конструктор, объект необходимо закрыть с помощью метода Закрыть или НачатьЗакрытие. + /// + /// + /// + /// Поток, в который производится запись данных. Типы: Поток (Stream), ПотокВПамяти (MemoryStream), ФайловыйПоток (FileStream) + /// + /// Устанавливает кодировку текста для создаваемого экземпляра ЗаписьДанных. Если не задано, используется кодировка UTF-8. + /// Значение по умолчанию: UTF8. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// Порядок байтов, используемый по умолчанию для кодирования целых чисел при записи в поток. + /// Значение по умолчанию: LittleEndian. + /// + /// Разделитель по умолчанию для строк, записываемых в поток. Если разделитель строк не задан, то используется строка ПС. + /// Значение по умолчанию: ПС. + /// + /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС. + /// Значение по умолчанию: ВК + ПС. + /// + /// Если в начало файла или потока требуется записать метку порядка байтов (BOM) для используемой кодировки текста, то данный параметр должен иметь значение Истина. + /// Значение по умолчанию: Ложь. + /// + [ScriptConstructor(Name = "На основании потока")] + public static IRuntimeContextInstance Constructor1(IValue stream, IValue textEncoding = null, ByteOrderEnum? byteOrder = null, string lineSplitter = null, string convertibleSplitterOfLines = null, bool writeBOM = false) + { + var streamObj = stream.AsObject() as IStreamWrapper; + if (streamObj == null) + { + throw RuntimeException.InvalidArgumentType(nameof(stream)); + } + + return new DataWriter(streamObj, textEncoding, byteOrder, lineSplitter, convertibleSplitterOfLines, writeBOM); + } - /// - /// - /// Записывает один байт в целевой поток. - /// - /// - /// - /// Целое число, которое будет записано в целевой поток. Значение числа должно находиться в диапазоне от 0 до 255. - /// - [ContextMethod("ЗаписатьБайт", "WriteByte")] - public void WriteByte(int number) - { - throw new NotImplementedException(); - } + /// + /// + /// Кодировка текста по-умолчанию для данного экземпляра ЗаписьДанных. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// + /// КодировкаТекста (TextEncoding), Строка (String) + [ContextProperty("КодировкаТекста", "TextEncoding")] + public IValue TextEncoding + { + get { return _userVisibleEncoding; } + set + { + if (value != null) + { + _workingEncoding = TextEncodingEnum.GetEncoding(value, _writeBOM); + _userVisibleEncoding = value; + } + else + { + _workingEncoding = new UTF8Encoding(true); + _userVisibleEncoding = ValueFactory.Create("utf-8"); + } + } + } - /// - /// - /// Записать байты из буфера двоичных данных в целевой поток. - /// - /// - /// - /// - /// Запись буфера - /// - /// - /// - /// Буфер двоичных данных, все байты которого будут записаны в целевой поток. - /// - [ContextMethod("ЗаписатьБуферДвоичныхДанных", "WriteBinaryDataBuffer")] - public void WriteBinaryDataBuffer(IValue buffer) - { - throw new NotImplementedException(); - } + /// + /// + /// Конвертируемый разделитель строк. Этот параметр влияет на поведение метода ЗаписатьСимволы. + /// + /// Строка (String) + [ContextProperty("КонвертируемыйРазделительСтрок", "ConvertibleSplitterOfLines")] + public string ConvertibleSplitterOfLines { get; set; } + /// + /// + /// Порядок байтов по умолчанию. + /// + /// ПорядокБайтов (ByteOrder) + [ContextProperty("ПорядокБайтов", "ByteOrder")] + public ByteOrderEnum ByteOrder { get; private set; } - /// - /// - /// Записать байты из буфера двоичных данных в целевой поток. - /// - /// - /// - /// - /// Запись части байтов из буфера - /// - /// - /// - /// Буфер двоичных данных, который используется в качестве источника данных для записи в целевой поток. - /// - /// Позиция в буфере, начиная с которой выполняется чтение байтов для записи в целевой поток. - /// - /// Количество байтов, которые требуется записать в целевой поток. - /// - [ContextMethod("ЗаписатьБуферДвоичныхДанных", "WriteBinaryDataBuffer")] - public void WriteBinaryDataBuffer(IValue buffer, int positionInBuffer, int number) - { - throw new NotImplementedException(); - } + /// + /// + /// Разделитель строк по-умолчанию. Это свойство влияет на поведение метода ЗаписатьСтроку. + /// + /// Строка (String) + [ContextProperty("РазделительСтрок", "LineSplitter")] + public string LineSplitter { get; set; } + + /// + /// + /// Вызывает метод СброситьБуферы. Если целевой поток был создан при создании объекта ЗаписьДанных, целевой поток также закрывается. + /// + /// + /// + [ContextMethod("Закрыть", "Close")] + public void Close() + { + _binaryWriter.Close(); + } - /// - /// - /// Записывает символы заданной строки в целевой поток. - /// - /// - /// - /// Строка, символы которой будут записаны в поток. - /// - /// Определяет кодировку текста для записи строки. Если не установлена, используется кодировка, заданная для данного объекта ЗаписьДанных. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// - [ContextMethod("ЗаписатьСимволы", "WriteChars")] - public void WriteChars(string line, IValue encoding = null) - { - throw new NotImplementedException(); - } + /// + /// + /// Записывает данные в целевой поток. + /// + /// + /// + /// + /// Запись двоичных данных + /// + /// + /// + /// Записать экземпляр объекта ДвоичныеДанные в поток. + /// + [ContextMethod("Записать", "Write")] + public void Write(IValue binaryDataOrReadResult) + { + var binData = binaryDataOrReadResult.AsObject() as BinaryDataContext; + if (binData == null) //TODO: Поддержкать класс РезультатЧтенияДанных + throw RuntimeException.InvalidArgumentType(); - /// - /// - /// Записывает строку в целевой поток. - /// Сначала записываются все символы строки, затем - разделитель строк. - /// - /// - /// - /// Строка, которая будет записана в поток. - /// - /// Определяет кодировку текста для записи строки. Если не установлена, используется кодировка, заданная для данного объекта ЗаписьДанных. - /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. - /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) - /// - /// Указывает строку, являющуюся разделителем строк в потоке после записи символов строк. Если параметр не указан, используется разделитель строк, указанный для текущего экземпляра объекта ЗаписьДанных. - /// Значение по умолчанию: Неопределено. - /// - [ContextMethod("ЗаписатьСтроку", "WriteLine")] - public void WriteLine(string line, IValue encoding = null, string lineSplitter = null) - { - throw new NotImplementedException(); - } + _binaryWriter.Write(binData.Buffer, 0, binData.Size()); + } - /// - /// - /// Записывает 16-разрядное число в целевой поток. - /// - /// - /// - /// Число, которое будет записано в целевой поток. - /// Значение числа должно находиться в диапазоне от 0 до 65535. - /// - /// Порядок байтов, который будет использован для кодировки числа при записи. Если не установлен, то будет использован порядок байтов, заданный для текущего экземпляра объекта ЗаписьДанных. - /// Значение по умолчанию: Неопределено. - /// - [ContextMethod("ЗаписатьЦелое16", "WriteInt16")] - public void WriteInt16(int number, IValue byteOrder = null) - { - throw new NotImplementedException(); - } + /// + /// + /// Записывает один байт в целевой поток. + /// + /// + /// + /// Целое число, которое будет записано в целевой поток. Значение числа должно находиться в диапазоне от 0 до 255. + /// + [ContextMethod("ЗаписатьБайт", "WriteByte")] + public void WriteByte(byte number) + { + _binaryWriter.Write(number); + } + + /// + /// + /// Записать байты из буфера двоичных данных в целевой поток. + /// + /// + /// + /// + /// Запись части байтов из буфера + /// + /// + /// + /// Буфер двоичных данных, который используется в качестве источника данных для записи в целевой поток. + /// + /// Позиция в буфере, начиная с которой выполняется чтение байтов для записи в целевой поток. + /// + /// Количество байтов, которые требуется записать в целевой поток. + /// + [ContextMethod("ЗаписатьБуферДвоичныхДанных", "WriteBinaryDataBuffer")] + public void WriteBinaryDataBuffer(BinaryDataBuffer buffer, int positionInBuffer = 0, int number = 0) + { + if(positionInBuffer == 0 && number == 0) + _binaryWriter.Write(buffer.Bytes, 0, buffer.Count()); + else + _binaryWriter.Write(buffer.Bytes, positionInBuffer, number); + } - /// - /// - /// Записать целое 32-битное число в целевой поток. - /// - /// - /// - /// Целое число, которое будет записано в целевой поток. Значение числа должно находиться в диапазоне от 0 до 2^32-1. - /// - /// Порядок байтов, который будет использован для кодировки числа при записи. Если не установлен, то будет использован порядок байтов, заданный для текущего экземпляра объекта ЗаписьДанных. - /// Значение по умолчанию: Неопределено. - /// - [ContextMethod("ЗаписатьЦелое32", "WriteInt32")] - public void WriteInt32(int number, IValue byteOrder = null) - { - throw new NotImplementedException(); - } + /// + /// + /// Записывает символы заданной строки в целевой поток. + /// + /// + /// + /// Строка, символы которой будут записаны в поток. + /// + /// Определяет кодировку текста для записи строки. Если не установлена, используется кодировка, заданная для данного объекта ЗаписьДанных. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// + [ContextMethod("ЗаписатьСимволы", "WriteChars")] + public void WriteChars(string line, IValue encoding = null) + { + if(encoding == null) + _binaryWriter.Write(line); + else + { + var enc = TextEncodingEnum.GetEncoding(encoding, _writeBOM); + var bytes = enc.GetBytes(line); + _binaryWriter.Write(bytes,0,bytes.Length); + } + } - /// - /// - /// Записывает целое 16-битное число в целевой поток. - /// - /// - /// - /// Целое число, которое будет записано в целевой поток. Значение числа должно находиться в диапазоне от 0 до 2^64-1. - /// - /// Порядок байтов, который будет использован для кодировки числа при записи. Если не установлен, то будет использован порядок байтов, заданный для текущего экземпляра объекта ЗаписьДанных. - /// Значение по умолчанию: Неопределено. - /// - [ContextMethod("ЗаписатьЦелое64", "WriteInt64")] - public void WriteInt64(int number, IValue byteOrder = null) - { - throw new NotImplementedException(); - } + /// + /// + /// Записывает строку в целевой поток. + /// Сначала записываются все символы строки, затем - разделитель строк. + /// + /// + /// + /// Строка, которая будет записана в поток. + /// + /// Определяет кодировку текста для записи строки. Если не установлена, используется кодировка, заданная для данного объекта ЗаписьДанных. + /// Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки. + /// Значение по умолчанию: Неопределено. Типы: КодировкаТекста (TextEncoding), Строка (String) + /// + /// Указывает строку, являющуюся разделителем строк в потоке после записи символов строк. Если параметр не указан, используется разделитель строк, указанный для текущего экземпляра объекта ЗаписьДанных. + /// Значение по умолчанию: Неопределено. + /// + [ContextMethod("ЗаписатьСтроку", "WriteLine")] + public void WriteLine(string line, IValue encoding = null, string lineSplitter = null) + { + // TODO: Для экономии времени не поддерживаем пока конвертируемый разделитель строк + // Кому надо - попросит PR. - /// - /// - /// Сбрасывает все внутренние буферы в целевой поток, после чего вызывает метод СброситьБуферы целевого потока. - /// - /// - [ContextMethod("СброситьБуферы", "Flush")] - public void Flush() - { - throw new NotImplementedException(); - } + if (encoding == null) + _binaryWriter.Write(line); + else + { + var enc = TextEncodingEnum.GetEncoding(encoding, _writeBOM); + var bytes = enc.GetBytes(line); + _binaryWriter.Write(bytes, 0, bytes.Length); + } + if(lineSplitter == null) + _binaryWriter.Write(LineSplitter); + else + _binaryWriter.Write(lineSplitter); + } - /// - /// - /// Возвращает целевой поток, в который выполняется запись. - /// - /// - /// - /// - /// - [ContextMethod("ЦелевойПоток", "TargetStream")] - public IValue TargetStream() - { - throw new NotImplementedException(); - } + private byte[] GetBytes(T value, Converter leConverter, Converter beConverter, IValue byteOrder = null) + { + ByteOrderEnum workByteOrder; + if (byteOrder == null) + workByteOrder = ByteOrder; + else + { + var enumVal = byteOrder.GetRawValue() as IObjectWrapper; + if (enumVal == null) + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); + + try + { + workByteOrder = (ByteOrderEnum) enumVal.UnderlyingObject; + } + catch (InvalidCastException) + { + throw RuntimeException.InvalidArgumentType(nameof(byteOrder)); + } + } + + var converter = workByteOrder == ByteOrderEnum.BigEndian ? beConverter : leConverter; + return converter(value); + } + + /// + /// + /// Записывает 16-разрядное число в целевой поток. + /// + /// + /// + /// Число, которое будет записано в целевой поток. + /// Значение числа должно находиться в диапазоне от 0 до 65535. + /// + /// Порядок байтов, который будет использован для кодировки числа при записи. Если не установлен, то будет использован порядок байтов, заданный для текущего экземпляра объекта ЗаписьДанных. + /// Значение по умолчанию: Неопределено. + /// + [ContextMethod("ЗаписатьЦелое16", "WriteInt16")] + public void WriteInt16(short number, IValue byteOrder = null) + { + var buffer = GetBytes(number, BitConversionFacility.LittleEndian.GetBytes, BitConversionFacility.BigEndian.GetBytes, byteOrder); + _binaryWriter.Write(buffer, 0, buffer.Length); + } + + /// + /// + /// Записать целое 32-битное число в целевой поток. + /// + /// + /// + /// Целое число, которое будет записано в целевой поток. Значение числа должно находиться в диапазоне от 0 до 2^32-1. + /// + /// Порядок байтов, который будет использован для кодировки числа при записи. Если не установлен, то будет использован порядок байтов, заданный для текущего экземпляра объекта ЗаписьДанных. + /// Значение по умолчанию: Неопределено. + /// + [ContextMethod("ЗаписатьЦелое32", "WriteInt32")] + public void WriteInt32(int number, IValue byteOrder = null) + { + var buffer = GetBytes(number, BitConversionFacility.LittleEndian.GetBytes, BitConversionFacility.BigEndian.GetBytes, byteOrder); + _binaryWriter.Write(buffer, 0, buffer.Length); + } + + /// + /// + /// Записывает целое 16-битное число в целевой поток. + /// + /// + /// + /// Целое число, которое будет записано в целевой поток. Значение числа должно находиться в диапазоне от 0 до 2^64-1. + /// + /// Порядок байтов, который будет использован для кодировки числа при записи. Если не установлен, то будет использован порядок байтов, заданный для текущего экземпляра объекта ЗаписьДанных. + /// Значение по умолчанию: Неопределено. + /// + [ContextMethod("ЗаписатьЦелое64", "WriteInt64")] + public void WriteInt64(long number, IValue byteOrder = null) + { + var buffer = GetBytes(number, BitConversionFacility.LittleEndian.GetBytes, BitConversionFacility.BigEndian.GetBytes, byteOrder); + _binaryWriter.Write(buffer, 0, buffer.Length); + } + + /// + /// + /// Сбрасывает все внутренние буферы в целевой поток, после чего вызывает метод СброситьБуферы целевого потока. + /// + /// + [ContextMethod("СброситьБуферы", "Flush")] + public void Flush() + { + _binaryWriter.Flush(); + } + + + /// + /// + /// Возвращает целевой поток, в который выполняется запись. + /// + /// + /// + /// + /// + [ContextMethod("ЦелевойПоток", "TargetStream")] + public IValue TargetStream() + { + return new GenericStream(_binaryWriter.BaseStream); + } + + public void Dispose() + { + _binaryWriter.Dispose(); + } + } } diff --git a/src/ScriptEngine.HostedScript/Library/Binary/EndianBitConverter.cs b/src/ScriptEngine.HostedScript/Library/Binary/EndianBitConverter.cs index 2a7b02e20..bee556987 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/EndianBitConverter.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/EndianBitConverter.cs @@ -383,7 +383,7 @@ public int ToInt16(byte[] value, int startIndex) } else { - int a = (value[startIndex] << 8 | value[startIndex + 1]); + var a = (value[startIndex] << 8 | value[startIndex + 1]); return a; } } diff --git a/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs b/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs index 25fbf687a..3a0eade7c 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs @@ -32,7 +32,8 @@ public FileStreamContext(string filename, FileOpenModeEnum openMode, FileAccessE if(bufferSize == 0) _underlyingStream = new FileStream(filename, FileStreamsManager.ConvertFileOpenModeToCLR(openMode), - FileStreamsManager.ConvertFileAccessToCLR(access)); + FileStreamsManager.ConvertFileAccessToCLR(access), + FileShare.Read); else _underlyingStream = new FileStream(filename, FileStreamsManager.ConvertFileOpenModeToCLR(openMode), diff --git a/src/ScriptEngine.HostedScript/Library/Binary/FileStreamsManager.cs b/src/ScriptEngine.HostedScript/Library/Binary/FileStreamsManager.cs index 143e4aeeb..65e967a54 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/FileStreamsManager.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/FileStreamsManager.cs @@ -101,7 +101,7 @@ public FileStreamContext Open(IValue fileName, IValue openingMode, IValue fileAc /// Имя открываемого файла. /// [ContextMethod("ОткрытьДляДописывания", "OpenForAppend")] - public IValue OpenForAppend(string fileName) + public FileStreamContext OpenForAppend(string fileName) { return new FileStreamContext(fileName, FileOpenModeEnum.Append, FileAccessEnum.ReadAndWrite); } @@ -124,10 +124,10 @@ public IValue OpenForAppend(string fileName) /// [ContextMethod("ОткрытьДляЗаписи", "OpenForWrite")] - public IValue OpenForWrite(string fileName) + public FileStreamContext OpenForWrite(string fileName) { - // TODO: Судя по описанию - открывается без обрезки (Truncate). Надо проверить. - return new FileStreamContext(fileName, File.OpenWrite(fileName)); + // TODO: Судя по описанию - открывается без обрезки (Truncate). Надо проверить в 1С. + return new FileStreamContext(fileName, FileOpenModeEnum.OpenOrCreate, FileAccessEnum.Write); } @@ -142,9 +142,9 @@ public IValue OpenForWrite(string fileName) /// /// [ContextMethod("ОткрытьДляЧтения", "OpenForRead")] - public IValue OpenForRead(string fileName) + public FileStreamContext OpenForRead(string fileName) { - return new FileStreamContext(fileName, File.OpenRead(fileName)); + return new FileStreamContext(fileName, FileOpenModeEnum.Open, FileAccessEnum.Read); } @@ -162,7 +162,7 @@ public IValue OpenForRead(string fileName) [ContextMethod("Создать", "Create")] public IValue Create(string fileName, int bufferSize = 0) { - return new FileStreamContext(fileName, File.Create(fileName, bufferSize == 0 ? 8192: bufferSize)); + return new FileStreamContext(fileName, new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read, bufferSize == 0 ? 8192 : bufferSize)); } diff --git a/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs b/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs index 80ba5c010..41c17bfae 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs @@ -11,7 +11,7 @@ This Source Code Form is subject to the terms of the namespace ScriptEngine.HostedScript.Library.Binary { - internal interface IStreamWrapper + public interface IStreamWrapper { Stream GetUnderlyingStream(); diff --git a/src/ScriptEngine.HostedScript/Library/Binary/ReadDataResult.cs b/src/ScriptEngine.HostedScript/Library/Binary/ReadDataResult.cs index 0ff4655d6..8d9b7015c 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/ReadDataResult.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/ReadDataResult.cs @@ -5,173 +5,105 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -//using System; -//using ScriptEngine.Machine; -//using ScriptEngine.Machine.Contexts; - - - -///// -///// -///// Содержит описание результата чтения данных из потока. -///// -//[ContextClass("РезультатЧтенияДанных", "ReadDataResult")] -//class ReadDataResult : AutoContext -//{ - -//private int _MarkerIndex - -//private bool _MarkerFound - -//private int _Size - -//public ReadDataResult() -//{ -//} - - -///// -///// -///// Индекс найденного маркера. -///// -///// Число (Number) -//[ContextProperty("ИндексМаркера", "MarkerIndex")] -//public int MarkerIndex -//{ -// get { return _MarkerIndex; } - -//} - - -///// -///// -///// Содержит признак обнаружения маркера: -///// -///// - Истина - если в процессе чтения данных был обнаружен маркер. -///// - Ложь - если маркер не был найден или операция не предполагала поиска маркера. -///// -///// Булево (Boolean) -//[ContextProperty("МаркерНайден", "MarkerFound")] -//public bool MarkerFound -//{ -// get { return _MarkerFound; } - -//} - - -///// -///// -///// Размер данных в байтах. В некоторых случаях может быть равен нулю. Например, при чтении двоичных данных из конца потока или при разделении данных. -///// -///// Число (Number) -//[ContextProperty("Размер", "Size")] -//public int Size -//{ -// get { return _Size; } - -//} - - -///// -///// -///// Начать получение результата в виде буфера двоичных данных. -///// -///// -///// -///// Содержит описание процедуры, которая будет вызвана после завершения работы метода со следующими параметрами: -///// -///// - <Результат> - тип БуферДвоичныхДанных. Буфер, содержащий результат получения данных. -///// - <ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения. - -///// - -///// -//[ContextMethod("НачатьПолучениеБуфераДвоичныхДанных", "BeginGetBinaryDataBuffer")] -//public void BeginGetBinaryDataBuffer( IValue NotifyDescription) -//{ - -//} - - -///// -///// -///// Начинает получение результата чтения в виде двоичных данных. -///// -///// -///// -///// Содержит описание процедуры, которая будет вызвана после завершения работы метода со следующими параметрами: -///// -///// - <Результат> - тип ДвоичныеДанные. Результат получения данных, -///// - <ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения. - -///// - -///// -//[ContextMethod("НачатьПолучениеДвоичныхДанных", "BeginGetBinaryData")] -//public void BeginGetBinaryData( IValue NotifyDescription) -//{ - -//} - - -///// -///// -///// Открывает поток для чтения данных. -///// -///// - -///// -///// -///// Представляет собой поток данных, который можно последовательно читать и/или в который можно последовательно писать. -///// Экземпляры объектов данного типа можно получить с помощью различных методов других объектов. - -///// -//[ContextMethod("ОткрытьПотокДляЧтения", "OpenStreamForRead")] -//public IValue OpenStreamForRead() -//{ -// return null; -//} - - -///// -///// -///// Получает результат в виде буфера двоичных данных. Необходимо учитывать, что при этом данные будут полностью загружены в оперативную память. Если требуется избежать загрузки оперативной памяти, следует использовать другие методы получения двоичных данных. -///// -///// - -///// -///// -///// Коллекция байтов фиксированного размера с возможностью произвольного доступа и изменения по месту. -///// Размер буфера формально не ограничен, но поскольку все данные буфера полностью находятся в оперативной памяти, при попытке создать буфер слишком большого размера доступной памяти может оказаться недостаточно, в результате чего будет вызвано исключение. Поэтому при работе с буферами двоичных данных необходимо соотносить их размер с доступным объемом оперативной памяти. -///// При создании буфера можно указать порядок байтов, который будет использован для операций с целыми числами. При этом если буфер не создан явно, а получен с помощью вызова метода другого объекта, то порядок байтов в полученном буфере будет унаследован от порядка байтов, заданного для того объекта, метод которого вызывается. -///// Например, если буфер получен с помощью вызова метода ПрочитатьВБуферДвоичныхДанных, то порядок байтов в полученном буфере будет равен значению свойства ПорядокБайтов. -///// Возможен также более сложный случай наследования порядка байтов. Если буфер получен с помощью вызова метода ПолучитьБуферДвоичныхДанных, то порядок байтов у полученного буфера будет выбираться из объекта ЧтениеДанных, из которого был получен объект РезультатЧтенияДанных. -///// Порядок байтов, заданный для объекта ЧтениеДанных, будет использован во всех объектах, полученных на его основании. - -///// -//[ContextMethod("ПолучитьБуферДвоичныхДанных", "GetBinaryDataBuffer")] -//public IValue GetBinaryDataBuffer() -//{ -// return null; -//} - - -///// -///// -///// Получает результат чтения в виде двоичных данных. -///// -///// - -///// -///// -///// Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. -///// Хранимые данные могут быть записаны в файл. - -///// -//[ContextMethod("ПолучитьДвоичныеДанные", "GetBinaryData")] -//public IValue GetBinaryData() -//{ -// return null; -//} - -//} +using System.IO; + +using ScriptEngine.Machine; +using ScriptEngine.Machine.Contexts; + +namespace ScriptEngine.HostedScript.Library.Binary +{ + /// + /// + /// Содержит описание результата чтения данных из потока. + /// + [ContextClass("РезультатЧтенияДанных", "ReadDataResult")] + public class ReadDataResult : AutoContext + { + private readonly byte[] _data; + public ReadDataResult(byte[] data) + { + // Поиск по маркеру на данный момент не реализован. + MarkerIndex = -1; + MarkerFound = false; + + _data = data; + Size = _data.Length; + } + + /// + /// + /// Индекс найденного маркера. + /// + /// Число (Number) + [ContextProperty("ИндексМаркера", "MarkerIndex")] + public int MarkerIndex { get; } + + /// + /// + /// Содержит признак обнаружения маркера: + /// + /// - Истина - если в процессе чтения данных был обнаружен маркер. + /// - Ложь - если маркер не был найден или операция не предполагала поиска маркера. + /// + /// Булево (Boolean) + [ContextProperty("МаркерНайден", "MarkerFound")] + public bool MarkerFound { get; } + + /// + /// + /// Размер данных в байтах. В некоторых случаях может быть равен нулю. Например, при чтении двоичных данных из конца потока или при разделении данных. + /// + /// Число (Number) + [ContextProperty("Размер", "Size")] + public int Size { get; } + + + /// + /// + /// Открывает поток для чтения данных. + /// + /// + /// + /// + /// Представляет собой поток данных, который можно последовательно читать и/или в который можно последовательно писать. + /// Экземпляры объектов данного типа можно получить с помощью различных методов других объектов. + /// + [ContextMethod("ОткрытьПотокДляЧтения", "OpenStreamForRead")] + public GenericStream OpenStreamForRead() + { + var stream = new MemoryStream(_data); + return new GenericStream(stream); + } + + /// + /// + /// Получает результат в виде буфера двоичных данных. Необходимо учитывать, что при этом данные будут полностью загружены в оперативную память. Если требуется избежать загрузки оперативной памяти, следует использовать другие методы получения двоичных данных. + /// + /// + /// + /// Коллекция байтов фиксированного размера с возможностью произвольного доступа и изменения по месту. + /// + [ContextMethod("ПолучитьБуферДвоичныхДанных", "GetBinaryDataBuffer")] + public IValue GetBinaryDataBuffer() + { + // вроде бы, 1С делает копию данных для данного метода. + // требуется уточнить правильное поведение + return new BinaryDataBuffer((byte[])_data.Clone()); + } + + /// + /// + /// Получает результат чтения в виде двоичных данных. + /// + /// + /// + /// + /// + [ContextMethod("ПолучитьДвоичныеДанные", "GetBinaryData")] + public IValue GetBinaryData() + { + return new BinaryDataContext(_data); + } + + } +} diff --git a/src/ScriptEngine.HostedScript/Library/Reflector.cs b/src/ScriptEngine.HostedScript/Library/Reflector.cs index 28f430c12..593afead0 100644 --- a/src/ScriptEngine.HostedScript/Library/Reflector.cs +++ b/src/ScriptEngine.HostedScript/Library/Reflector.cs @@ -5,12 +5,17 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; + using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; using ScriptEngine.HostedScript.Library.ValueTable; +using MethodInfo = ScriptEngine.Machine.MethodInfo; + namespace ScriptEngine.HostedScript.Library { /// @@ -21,11 +26,6 @@ namespace ScriptEngine.HostedScript.Library [ContextClass("Рефлектор","Reflector")] public class ReflectorContext : AutoContext { - public ReflectorContext() - { - - } - /// /// Вызывает метод по его имени. /// @@ -83,10 +83,6 @@ private static IValue[] GetArgsToPass(ArrayImpl arguments, MethodInfo methInfo) } while (argsToPass.Count < methInfo.ArgCount) { - if (!methInfo.Params[argsToPass.Count].HasDefaultValue) - { - throw RuntimeException.TooLittleArgumentsPassed(); - } argsToPass.Add(null); } @@ -100,7 +96,18 @@ private static IValue[] GetArgsToPass(ArrayImpl arguments, MethodInfo methInfo) /// Имя метода для вызова /// Истину, если метод существует, и Ложь в обратном случае. [ContextMethod("МетодСуществует", "MethodExists")] - public bool MethodExists(IRuntimeContextInstance target, string methodName) + public bool MethodExists(IValue target, string methodName) + { + if(target.DataType == DataType.Object) + return MethodExistsForObject(target.AsObject(), methodName); + + if (target.DataType == DataType.Type) + return MethodExistsForType(target.GetRawValue() as TypeTypeValue, methodName); + + throw RuntimeException.InvalidArgumentType("target"); + } + + private static bool MethodExistsForObject(IRuntimeContextInstance target, string methodName) { try { @@ -113,6 +120,53 @@ public bool MethodExists(IRuntimeContextInstance target, string methodName) } } + private static bool MethodExistsForType(TypeTypeValue type, string methodName) + { + var clrType = GetReflectableClrType(type); + var mapper = CreateMethodsMapper(clrType); + + var actualType = mapper.GetType(); + int result = (int)actualType.InvokeMember("FindMethod", + BindingFlags.InvokeMethod, + null, + mapper, + new object[]{methodName}); + return result >= 0; + } + + private static object CreateMethodsMapper(Type clrType) + { + var mapperType = typeof(ContextMethodsMapper<>).MakeGenericType(clrType); + var instance = Activator.CreateInstance(mapperType); + return instance; + } + + private static dynamic CreatePropertiesMapper(Type clrType) + { + var mapperType = typeof(ContextPropertyMapper<>).MakeGenericType(clrType); + var instance = Activator.CreateInstance(mapperType); + dynamic magicCaller = instance; // зачем строить ExpressionTree, когда есть dynamic + return magicCaller; + } + + private static Type GetReflectableClrType(TypeTypeValue type) + { + Type clrType; + try + { + clrType = TypeManager.GetImplementingClass(type.Value.ID); + } + catch (InvalidOperationException) + { + throw RuntimeException.InvalidArgumentValue("Тип не может быть отражен."); + } + + var attrs = clrType.GetCustomAttributes(typeof(ContextClassAttribute), false).ToArray(); + if (attrs.Length == 0) + throw RuntimeException.InvalidArgumentValue("Тип не может быть отражен."); + + return clrType; + } /// /// Получает таблицу методов для переданного объекта.. @@ -120,23 +174,50 @@ public bool MethodExists(IRuntimeContextInstance target, string methodName) /// Объект, из которого получаем таблицу методов. /// Таблица значений с 3 колонками - Имя, КоличествоПараметров, ЭтоФункция. [ContextMethod("ПолучитьТаблицуМетодов", "GetMethodsTable")] - public ValueTable.ValueTable GetMethodsTable(IRuntimeContextInstance target) + public ValueTable.ValueTable GetMethodsTable(IValue target) { - ValueTable.ValueTable Result = new ValueTable.ValueTable(); - - var NameColumn = Result.Columns.Add("Имя", TypeDescription.StringType(), "Имя"); - var CountColumn = Result.Columns.Add("КоличествоПараметров", TypeDescription.IntegerType(), "Количество параметров"); - var IsFunctionColumn = Result.Columns.Add("ЭтоФункция", TypeDescription.BooleanType(), "Это функция"); + var result = new ValueTable.ValueTable(); + if(target.DataType == DataType.Object) + FillMethodsTableForObject(target.AsObject(), result); + else if (target.DataType == DataType.Type) + FillMethodsTableForType(target.GetRawValue() as TypeTypeValue, result); + else + throw RuntimeException.InvalidArgumentType(); + + return result; + } + + private static void FillMethodsTableForObject(IRuntimeContextInstance target, ValueTable.ValueTable result) + { + FillMethodsTable(result, target.GetMethods()); + } - foreach(var methInfo in target.GetMethods()) + private static void FillMethodsTableForType(TypeTypeValue type, ValueTable.ValueTable result) + { + var clrType = GetReflectableClrType(type); + var mapper = CreateMethodsMapper(clrType); + var actualType = mapper.GetType(); + var infos = (IEnumerable)actualType.InvokeMember("GetMethods", + BindingFlags.InvokeMethod, + null, + mapper, + new object[0]); + FillMethodsTable(result, infos); + } + + private static void FillMethodsTable(ValueTable.ValueTable result, IEnumerable methods) + { + var nameColumn = result.Columns.Add("Имя", TypeDescription.StringType(), "Имя"); + var countColumn = result.Columns.Add("КоличествоПараметров", TypeDescription.IntegerType(), "Количество параметров"); + var isFunctionColumn = result.Columns.Add("ЭтоФункция", TypeDescription.BooleanType(), "Это функция"); + + foreach (var methInfo in methods) { - ValueTableRow new_row = Result.Add(); - new_row.Set(NameColumn, ValueFactory.Create(methInfo.Name)); - new_row.Set(CountColumn, ValueFactory.Create(methInfo.ArgCount)); - new_row.Set(IsFunctionColumn, ValueFactory.Create(methInfo.IsFunction)); + ValueTableRow new_row = result.Add(); + new_row.Set(nameColumn, ValueFactory.Create(methInfo.Name)); + new_row.Set(countColumn, ValueFactory.Create(methInfo.ArgCount)); + new_row.Set(isFunctionColumn, ValueFactory.Create(methInfo.IsFunction)); } - - return Result; } /// @@ -145,23 +226,37 @@ public ValueTable.ValueTable GetMethodsTable(IRuntimeContextInstance target) /// Объект, из которого получаем таблицу свойств. /// Таблица значений с 1 колонкой - Имя [ContextMethod("ПолучитьТаблицуСвойств", "GetPropertiesTable")] - public ValueTable.ValueTable GetPropertiesTable(IRuntimeContextInstance target) + public ValueTable.ValueTable GetPropertiesTable(IValue target) { - ValueTable.ValueTable Result = new ValueTable.ValueTable(); + ValueTable.ValueTable result = new ValueTable.ValueTable(); + + if(target.DataType == DataType.Object) + FillPropertiesTable(result, target.AsObject().GetProperties()); + else if (target.DataType == DataType.Type) + { + var type = target.GetRawValue() as TypeTypeValue; + var clrType = GetReflectableClrType(type); + var magicCaller = CreatePropertiesMapper(clrType); + FillPropertiesTable(result, magicCaller.GetProperties()); + } + else + throw RuntimeException.InvalidArgumentType(); - var NameColumn = Result.Columns.Add("Имя", TypeDescription.StringType(), "Имя"); + return result; + } - var SystemVarNames = new string[] { "этотобъект", "thisobject" }; + private void FillPropertiesTable(ValueTable.ValueTable result, IEnumerable properties) + { + var nameColumn = result.Columns.Add("Имя", TypeDescription.StringType(), "Имя"); + var systemVarNames = new string[] { "этотобъект", "thisobject" }; - foreach (var propInfo in target.GetProperties()) + foreach (var propInfo in properties) { - if (SystemVarNames.Contains(propInfo.Identifier.ToLower())) continue; + if (systemVarNames.Contains(propInfo.Identifier.ToLower())) continue; - ValueTableRow new_row = Result.Add(); - new_row.Set(NameColumn, ValueFactory.Create(propInfo.Identifier)); + ValueTableRow newRow = result.Add(); + newRow.Set(nameColumn, ValueFactory.Create(propInfo.Identifier)); } - - return Result; } [ScriptConstructor] diff --git a/src/ScriptEngine.HostedScript/Library/SystemGlobalContext.cs b/src/ScriptEngine.HostedScript/Library/SystemGlobalContext.cs index bc9fff5a3..cc2445838 100755 --- a/src/ScriptEngine.HostedScript/Library/SystemGlobalContext.cs +++ b/src/ScriptEngine.HostedScript/Library/SystemGlobalContext.cs @@ -29,7 +29,6 @@ public class SystemGlobalContext : IAttachableContext private SymbolsContext _symbols; private readonly DynamicPropertiesHolder _propHolder = new DynamicPropertiesHolder(); private readonly List> _properties = new List>(); - private readonly SystemEnvironmentContext _systemEnvironmentContext; public SystemGlobalContext() { @@ -442,11 +441,16 @@ public decimal CurrentUniversalDateInMilliseconds() /// /// Проверяет заполненность значения по принципу, заложенному в 1С:Предприятии /// - /// + /// /// - [ContextMethod("ЗначениеЗаполнено","IsValueFilled")] - public bool IsValueFilled(IValue value) + [ContextMethod("ЗначениеЗаполнено","ValueIsFilled")] + public bool ValueIsFilled(IValue inValue) { + var value = inValue?.GetRawValue(); + if (value == null) + { + return false; + } if (value.DataType == DataType.Undefined) return false; else if (value.DataType == DataType.Boolean) @@ -460,20 +464,31 @@ public bool IsValueFilled(IValue value) var emptyDate = new DateTime(1, 1, 1, 0, 0, 0); return value.AsDate() != emptyDate; } - else if (value.GetRawValue() is COMWrapperContext) + else if (value is COMWrapperContext) { return true; } - else if (value.GetRawValue() is ICollectionContext) + else if (value is ICollectionContext) { - var col = value.GetRawValue() as ICollectionContext; + var col = value as ICollectionContext; return col.Count() != 0; } + else if (ValueFactory.CreateNullValue().Equals(value)) + { + return false; + } else return true; } + [ContextMethod("IsValueFilled", null, isDeprecated: true)] + [Obsolete] + public bool IsValueFilled(IValue value) + { + return ValueIsFilled(value); + } + /// /// Заполняет одноименные значения свойств одного объекта из другого /// @@ -589,18 +604,11 @@ public void OnAttach(MachineInstance machine, out MethodInfo[] methods) { variables = _state; - methods = GetMethods().ToArray(); - } - - public IEnumerable GetMethods() - { - var array = new MethodInfo[_methods.Count]; + methods = new MethodInfo[_methods.Count]; for (int i = 0; i < _methods.Count; i++) { - array[i] = _methods.GetMethodInfo(i); + methods[i] = _methods.GetMethodInfo(i); } - - return array; } #endregion diff --git a/src/ScriptEngine.HostedScript/Library/TextReadImpl.cs b/src/ScriptEngine.HostedScript/Library/TextReadImpl.cs index 88f21c54a..5b7dbb4c4 100644 --- a/src/ScriptEngine.HostedScript/Library/TextReadImpl.cs +++ b/src/ScriptEngine.HostedScript/Library/TextReadImpl.cs @@ -9,10 +9,12 @@ This Source Code Form is subject to the terms of the using System.Text; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; -using System.Collections.Generic; namespace ScriptEngine.HostedScript.Library { + /// + /// Предназначен для последовательного чтения файлов, в том числе большого размера. + /// [ContextClass("ЧтениеТекста", "TextReader")] public class TextReadImpl : AutoContext, IDisposable { @@ -25,24 +27,35 @@ public TextReadImpl () AnalyzeDefaultLineFeed = true; } + /// + /// Открывает текстовый файл для чтения. Ранее открытый файл закрывается. + /// + /// Путь к файлу + /// Кодировка + /// Раздедитель строк + /// Разделитель строк в файле + /// Открывать монопольно [ContextMethod("Открыть", "Open")] - public void Open(string path, IValue encoding = null, string lineDelimiter = "\n", string eolDelimiter = null) + public void Open(string path, IValue encoding = null, string lineDelimiter = "\n", string eolDelimiter = null, + bool? monopoly = null) { + Close(); TextReader imReader; + var shareMode = (monopoly ?? true) ? FileShare.None : FileShare.ReadWrite; if (encoding == null) { - imReader = Environment.FileOpener.OpenReader(path); + imReader = Environment.FileOpener.OpenReader(path, shareMode); } else { var enc = TextEncodingEnum.GetEncoding(encoding); - imReader = Environment.FileOpener.OpenReader(path, enc); + imReader = Environment.FileOpener.OpenReader(path, shareMode, enc); } _lineDelimiter = lineDelimiter ?? "\n"; if (eolDelimiter != null) - _reader = new CustomLineFeedStreamReader (imReader, eolDelimiter, AnalyzeDefaultLineFeed); + _reader = new CustomLineFeedStreamReader(imReader, eolDelimiter, AnalyzeDefaultLineFeed); else - _reader = new CustomLineFeedStreamReader (imReader, "\r\n", AnalyzeDefaultLineFeed); + _reader = new CustomLineFeedStreamReader(imReader, "\r\n", AnalyzeDefaultLineFeed); } @@ -53,6 +66,11 @@ private int ReadNext() return _reader.Read (); } + /// + /// Считывает строку указанной длины или до конца файла. + /// + /// Размер строки. Если не задан, текст считывается до конца файла + /// Строка - считанная строка, Неопределено - в файле больше нет данных [ContextMethod("Прочитать", "Read")] public IValue ReadAll(int size = 0) { @@ -74,6 +92,12 @@ public IValue ReadAll(int size = 0) return ValueFactory.Create(sb.ToString()); } + /// + /// Считывает очередную строку текстового файла. + /// + /// Подстрока, считающаяся концом строки. Переопределяет РазделительСтрок, + /// переданный в конструктор или в метод Открыть + /// Строка - в случае успешного чтения, Неопределено - больше нет данных [ContextMethod("ПрочитатьСтроку", "ReadLine")] public IValue ReadLine(string overridenLineDelimiter = null) { @@ -86,6 +110,9 @@ public IValue ReadLine(string overridenLineDelimiter = null) return ValueFactory.Create(l); } + /// + /// Закрывает открытый текстовый файл. Если файл был открыт монопольно, то после закрытия он становится доступен. + /// [ContextMethod("Закрыть", "Close")] public void Close() { @@ -100,6 +127,11 @@ private void RequireOpen() } } + /// + /// Открывает текстовый файл для чтения. + /// + /// Строка. Путь к файлу + /// ЧтениеТекста [ScriptConstructor(Name = "По имени файла без кодировки")] public static IRuntimeContextInstance Constructor (IValue path) { @@ -109,16 +141,35 @@ public static IRuntimeContextInstance Constructor (IValue path) return reader; } + /// + /// Открывает текстовый файл для чтения. Работает аналогично методу Открыть. + /// + /// Путь к файлу + /// Кодировка файла + /// Разделитель строк + /// Разделитель строк в файле + /// Открывать файл монопольно + /// ЧтениеТекста [ScriptConstructor(Name = "По имени файла")] - public static IRuntimeContextInstance Constructor (IValue path, IValue encoding = null, IValue lineDelimiter = null, IValue eolDelimiter = null) + public static IRuntimeContextInstance Constructor(IValue path, IValue encoding = null, + IValue lineDelimiter = null, IValue eolDelimiter = null, IValue monopoly = null) { var reader = new TextReadImpl(); if (lineDelimiter != null) reader.AnalyzeDefaultLineFeed = false; - reader.Open(path.AsString(), encoding, lineDelimiter?.GetRawValue().AsString() ?? "\n", eolDelimiter ?.GetRawValue().AsString()); + + reader.Open(path.AsString(), encoding, + lineDelimiter?.GetRawValue().AsString() ?? "\n", + eolDelimiter?.GetRawValue().AsString(), + monopoly?.AsBoolean() ?? true); + return reader; } + /// + /// Создаёт неинициализированный объект. Для инициализации необходимо открыть файл методом Открыть. + /// + /// ЧтениеТекста [ScriptConstructor(Name = "Формирование неинициализированного объекта")] public static IRuntimeContextInstance Constructor() { diff --git a/src/ScriptEngine.HostedScript/LibraryLoader.cs b/src/ScriptEngine.HostedScript/LibraryLoader.cs index e546721ca..7624e6498 100644 --- a/src/ScriptEngine.HostedScript/LibraryLoader.cs +++ b/src/ScriptEngine.HostedScript/LibraryLoader.cs @@ -11,7 +11,6 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; namespace ScriptEngine.HostedScript { @@ -57,7 +56,7 @@ public static LibraryLoader Create(ScriptingEngine engine, RuntimeEnvironment en { var code = engine.Loader.FromFile(processingScript); var compiler = engine.GetCompilerService(); - compiler.DefineVariable("ЭтотОбъект", SymbolType.ContextProperty); + compiler.DefineVariable("ЭтотОбъект", "ThisObject", SymbolType.ContextProperty); for (int i = 0; i < _methods.Count; i++) { @@ -135,6 +134,10 @@ protected override int FindOwnProperty(string name) { return 0; } + if(StringComparer.OrdinalIgnoreCase.Compare(name, "ThisObject") == 0) + { + return 0; + } return base.FindOwnProperty(name); } diff --git a/src/ScriptEngine.HostedScript/LibraryResolver.cs b/src/ScriptEngine.HostedScript/LibraryResolver.cs index 1750556f8..5789b3ae8 100644 --- a/src/ScriptEngine.HostedScript/LibraryResolver.cs +++ b/src/ScriptEngine.HostedScript/LibraryResolver.cs @@ -218,10 +218,6 @@ private bool LoadByPath(string libraryPath) private bool LoadByName(string value) { - var rootPath = Path.Combine(LibraryRoot, value); - if (LoadByPath(rootPath)) - return true; - foreach (var path in SearchDirectories) { if(!Directory.Exists(path)) @@ -232,6 +228,10 @@ private bool LoadByName(string value) return true; } + var rootPath = Path.Combine(LibraryRoot, value); + if (LoadByPath(rootPath)) + return true; + return false; } diff --git a/src/ScriptEngine.HostedScript/ScriptEngine.HostedScript.csproj b/src/ScriptEngine.HostedScript/ScriptEngine.HostedScript.csproj index e476d8b1c..126994351 100644 --- a/src/ScriptEngine.HostedScript/ScriptEngine.HostedScript.csproj +++ b/src/ScriptEngine.HostedScript/ScriptEngine.HostedScript.csproj @@ -91,6 +91,7 @@ + @@ -101,6 +102,7 @@ GlobalAssemblyInfo.cs + diff --git a/src/ScriptEngine/Compiler/Compiler.cs b/src/ScriptEngine/Compiler/Compiler.cs index e89fb7976..c2d3e2c74 100644 --- a/src/ScriptEngine/Compiler/Compiler.cs +++ b/src/ScriptEngine/Compiler/Compiler.cs @@ -604,19 +604,13 @@ private void BuildCodeBatch() if (_lastExtractedLexem.Token != Token.Semicolon) { - if (endTokens.Contains(_lastExtractedLexem.Token)) + if (endTokens.Contains(_lastExtractedLexem.Token) || LanguageDef.IsEndOfBlockToken(_lastExtractedLexem.Token)) { break; } - else - { - throw CompilerException.SemicolonExpected(); - } - } - else - { - NextToken(); + throw CompilerException.SemicolonExpected(); } + NextToken(); } } @@ -961,7 +955,8 @@ private void BuildReturnStatement() if (_isFunctionProcessed) { NextToken(); - if (_lastExtractedLexem.Token == Token.Semicolon) + if (_lastExtractedLexem.Token == Token.Semicolon + || LanguageDef.IsEndOfBlockToken(_lastExtractedLexem.Token)) { throw CompilerException.FuncEmptyReturnValue(); } @@ -971,7 +966,8 @@ private void BuildReturnStatement() else if (_inMethodScope) { NextToken(); - if (_lastExtractedLexem.Token != Token.Semicolon) + if (_lastExtractedLexem.Token != Token.Semicolon + && !LanguageDef.IsEndOfBlockToken(_lastExtractedLexem.Token)) { throw CompilerException.ProcReturnsAValue(); } @@ -1656,20 +1652,9 @@ private void CheckFactArguments(ParameterDefinition[] parameters, bool[] argsPas throw CompilerException.TooManyArgumentsPassed(); } - for (int i = 0; i < parameters.Length; i++) + if (parameters.Skip(argsPassed.Length).Any(param => !param.HasDefaultValue)) { - var paramDef = parameters[i]; - if (i < argsPassed.Length) - { - if (argsPassed[i] == false && !paramDef.HasDefaultValue) - { - throw CompilerException.ArgHasNoDefaultValue(i + 1); - } - } - else if (!paramDef.HasDefaultValue) - { - throw CompilerException.TooLittleArgumentsPassed(); - } + throw CompilerException.TooLittleArgumentsPassed(); } } diff --git a/src/ScriptEngine/Compiler/CompilerContext.cs b/src/ScriptEngine/Compiler/CompilerContext.cs index 4d968248c..255f4fdf1 100644 --- a/src/ScriptEngine/Compiler/CompilerContext.cs +++ b/src/ScriptEngine/Compiler/CompilerContext.cs @@ -147,7 +147,7 @@ public SymbolBinding DefineMethod(MethodInfo method) throw new InvalidOperationException("Scopes are not defined"); } - public SymbolBinding DefineVariable(string name) + public SymbolBinding DefineVariable(string name, string alias = null) { if (_scopeStack.Count > 0) { @@ -155,7 +155,7 @@ public SymbolBinding DefineVariable(string name) var scope = GetScope(idx); if (!scope.IsVarDefined(name)) { - var num = scope.DefineVariable(name); + var num = scope.DefineVariable(name, alias); return new SymbolBinding() { ContextIndex = idx, @@ -169,12 +169,12 @@ public SymbolBinding DefineVariable(string name) throw new InvalidOperationException("Scopes are not defined"); } - public SymbolBinding DefineProperty(string name) + public SymbolBinding DefineProperty(string name, string alias = null) { if (_scopeStack.Count > 0) { var idx = TopIndex(); - var num = _scopeStack[idx].DefineVariable(name, SymbolType.ContextProperty); + var num = _scopeStack[idx].DefineVariable(name, alias, SymbolType.ContextProperty); return new SymbolBinding() { ContextIndex = idx, diff --git a/src/ScriptEngine/Compiler/CompilerExceptions.cs b/src/ScriptEngine/Compiler/CompilerExceptions.cs index 9534bba34..2a51e46fb 100644 --- a/src/ScriptEngine/Compiler/CompilerExceptions.cs +++ b/src/ScriptEngine/Compiler/CompilerExceptions.cs @@ -83,11 +83,6 @@ internal static CompilerException TooManyArgumentsPassed() return new CompilerException("Слишком много фактических параметров"); } - internal static CompilerException ArgHasNoDefaultValue(int argNum) - { - return new CompilerException(string.Format("Аргумент {0} не имеет значения по умолчанию", argNum)); - } - internal static CompilerException InternalCompilerError(string reason) { return new CompilerException("Внутренняя ошибка компилятора:" + reason); diff --git a/src/ScriptEngine/Compiler/ICompilerContext.cs b/src/ScriptEngine/Compiler/ICompilerContext.cs index 32c1e0e4d..e5b9b6d45 100644 --- a/src/ScriptEngine/Compiler/ICompilerContext.cs +++ b/src/ScriptEngine/Compiler/ICompilerContext.cs @@ -12,8 +12,8 @@ namespace ScriptEngine.Compiler interface ICompilerContext { SymbolBinding DefineMethod(ScriptEngine.Machine.MethodInfo method); - SymbolBinding DefineProperty(string name); - SymbolBinding DefineVariable(string name); + SymbolBinding DefineProperty(string name, string alias = null); + SymbolBinding DefineVariable(string name, string alias = null); SymbolBinding GetMethod(string name); SymbolScope GetScope(int scopeIndex); VariableBinding GetVariable(string name); diff --git a/src/ScriptEngine/Compiler/ModuleCompilerContext.cs b/src/ScriptEngine/Compiler/ModuleCompilerContext.cs index ea6d7ee84..830230e86 100644 --- a/src/ScriptEngine/Compiler/ModuleCompilerContext.cs +++ b/src/ScriptEngine/Compiler/ModuleCompilerContext.cs @@ -5,9 +5,6 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using ScriptEngine.Machine; namespace ScriptEngine.Compiler @@ -36,17 +33,17 @@ public SymbolBinding DefineMethod(MethodInfo method) return sb; } - public SymbolBinding DefineProperty(string name) + public SymbolBinding DefineProperty(string name, string alias = null) { - var sb = _moduleCtx.DefineProperty(name); + var sb = _moduleCtx.DefineProperty(name, alias); ShiftIndex(ref sb); return sb; } - public SymbolBinding DefineVariable(string name) + public SymbolBinding DefineVariable(string name, string alias = null) { - var sb = _moduleCtx.DefineVariable(name); + var sb = _moduleCtx.DefineVariable(name, alias); ShiftIndex(ref sb); return sb; diff --git a/src/ScriptEngine/Compiler/SymbolScope.cs b/src/ScriptEngine/Compiler/SymbolScope.cs index be5d32813..1fa81403c 100644 --- a/src/ScriptEngine/Compiler/SymbolScope.cs +++ b/src/ScriptEngine/Compiler/SymbolScope.cs @@ -1,25 +1,24 @@ -/*---------------------------------------------------------- -This Source Code Form is subject to the terms of the -Mozilla Public License, v.2.0. If a copy of the MPL -was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. -----------------------------------------------------------*/ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using ScriptEngine.Machine; namespace ScriptEngine.Compiler { class SymbolScope - { - readonly Dictionary _variableNumbers = new Dictionary(StringComparer.OrdinalIgnoreCase); - - readonly List _variables = new List(); - - readonly Dictionary _methodsNumbers = new Dictionary(StringComparer.OrdinalIgnoreCase); - + { + readonly Dictionary _variableNumbers = new Dictionary(StringComparer.OrdinalIgnoreCase); + + readonly List _variables = new List(); + + readonly Dictionary _methodsNumbers = new Dictionary(StringComparer.OrdinalIgnoreCase); + readonly List _methods = new List(); public MethodInfo GetMethod(string name) @@ -34,11 +33,11 @@ public MethodInfo GetMethod(int number) } public int GetVariableNumber(string name) - { + { int varNumber; - if(_variableNumbers.TryGetValue(name, out varNumber)) - { - return varNumber; + if(_variableNumbers.TryGetValue(name, out varNumber)) + { + return varNumber; } else { @@ -73,43 +72,54 @@ public bool IsMethodDefined(string name) return _methodsNumbers.ContainsKey(name); } - public int DefineVariable(string name) - { - return DefineVariable(name, SymbolType.Variable); + public int DefineVariable(string name, string alias = null) + { + return DefineVariable(name, alias, SymbolType.Variable); } public int DefineVariable(string name, SymbolType symbolType) - { - if (!IsVarDefined(name)) - { - - var newIdx = _variables.Count; - _variableNumbers[name] = newIdx; - - _variables.Add(new VariableInfo() - { - Index = newIdx, - Identifier = name, - Type = symbolType - }); - - return newIdx; - } - else - { - throw new InvalidOperationException($"Symbol already defined in the scope ({name})"); - } + { + return DefineVariable(name, null, symbolType); } + public int DefineVariable(string name, string alias, SymbolType symbolType) + { + if (IsVarDefined(name)) + { + throw new InvalidOperationException($"Symbol already defined in the scope ({name})"); + } + if (!string.IsNullOrEmpty(alias) && IsVarDefined(alias)) + { + throw new InvalidOperationException($"Symbol already defined in the scope ({alias})"); + } + + var newIdx = _variables.Count; + _variableNumbers[name] = newIdx; + if (!string.IsNullOrEmpty(alias)) + { + _variableNumbers[alias] = newIdx; + } + + _variables.Add(new VariableInfo() + { + Index = newIdx, + Identifier = name, + Alias = alias, + Type = symbolType + }); + + return newIdx; + } + public int DefineMethod(MethodInfo method) { if (!IsMethodDefined(method.Name)) { int newIdx = _methods.Count; _methods.Add(method); - _methodsNumbers[method.Name] = newIdx; - - if (method.Alias != null) + _methodsNumbers[method.Name] = newIdx; + + if (method.Alias != null) _methodsNumbers[method.Alias] = newIdx; return newIdx; @@ -131,16 +141,16 @@ public int VariableCount { return _variables.Count; } - } - - public int MethodCount - { - get - { - return _methods.Count; - } - } - + } + + public int MethodCount + { + get + { + return _methods.Count; + } + } + public bool IsDynamicScope { get; diff --git a/src/ScriptEngine/Compiler/Tokens.cs b/src/ScriptEngine/Compiler/Tokens.cs index 84441dfcc..f5e2b9e3d 100644 --- a/src/ScriptEngine/Compiler/Tokens.cs +++ b/src/ScriptEngine/Compiler/Tokens.cs @@ -14,9 +14,11 @@ namespace ScriptEngine.Compiler static class LanguageDef { static readonly Dictionary _priority = new Dictionary(); - static readonly Dictionary _stringToToken = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - const int BUILTINS_INDEX = (int)Token.ByValParam; + static readonly Dictionary _stringToToken = + new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + const int BUILTINS_INDEX = (int) Token.ByValParam; // structure static LanguageDef() @@ -27,7 +29,7 @@ static LanguageDef() _priority.Add(Token.Multiply, 6); _priority.Add(Token.Division, 6); _priority.Add(Token.Modulo, 6); - + _priority.Add(Token.Or, 1); _priority.Add(Token.And, 2); _priority.Add(Token.Not, 3); @@ -38,7 +40,7 @@ static LanguageDef() _priority.Add(Token.MoreOrEqual, 4); _priority.Add(Token.LessOrEqual, 4); _priority.Add(Token.NotEqual, 4); - + // tokens #region Ключевые слова @@ -180,7 +182,7 @@ static LanguageDef() AddToken(Token.ModuleInfo, "текущийсценарий", "currentscript"); #endregion - + } private static void AddToken(Token token, string name) @@ -197,7 +199,7 @@ private static void AddToken(Token token, string name, string alias) public static Token GetToken(string tokText) { Token result; - if(_stringToToken.TryGetValue(tokText, out result)) + if (_stringToToken.TryGetValue(tokText, out result)) { return result; } @@ -214,25 +216,25 @@ public static int GetPriority(Token op) public static bool IsBuiltInFunction(Token token) { - return (int)token > BUILTINS_INDEX; + return (int) token > BUILTINS_INDEX; } public static bool IsBinaryOperator(Token token) { return token == Token.Plus - || token == Token.Minus - || token == Token.Multiply - || token == Token.Division - || token == Token.Modulo - || token == Token.And - || token == Token.Or - || token == Token.Not - || token == Token.LessThan - || token == Token.LessOrEqual - || token == Token.MoreThan - || token == Token.MoreOrEqual - || token == Token.Equal - || token == Token.NotEqual; + || token == Token.Minus + || token == Token.Multiply + || token == Token.Division + || token == Token.Modulo + || token == Token.And + || token == Token.Or + || token == Token.Not + || token == Token.LessThan + || token == Token.LessOrEqual + || token == Token.MoreThan + || token == Token.MoreOrEqual + || token == Token.Equal + || token == Token.NotEqual; } public static bool IsLogicalOperator(Token token) @@ -243,11 +245,11 @@ public static bool IsLogicalOperator(Token token) public static bool IsLiteral(ref Lexem lex) { return lex.Type == LexemType.StringLiteral - || lex.Type == LexemType.NumberLiteral - || lex.Type == LexemType.BooleanLiteral - || lex.Type == LexemType.DateLiteral - || lex.Type == LexemType.UndefinedLiteral - || lex.Type == LexemType.NullLiteral; + || lex.Type == LexemType.NumberLiteral + || lex.Type == LexemType.BooleanLiteral + || lex.Type == LexemType.DateLiteral + || lex.Type == LexemType.UndefinedLiteral + || lex.Type == LexemType.NullLiteral; } public static bool IsUserSymbol(ref Lexem lex) @@ -263,15 +265,26 @@ public static bool IsIdentifier(ref Lexem lex) public static Token[] BuiltInFunctions() { var values = Enum.GetValues(typeof(Token)); - var result = new Token[values.Length-BUILTINS_INDEX-1]; + var result = new Token[values.Length - BUILTINS_INDEX - 1]; for (int i = BUILTINS_INDEX + 1, j = 0; i < values.Length; i++, j++) { - result[j] = (Token)values.GetValue(i); + result[j] = (Token) values.GetValue(i); } return result; } + public static bool IsEndOfBlockToken(Token token) + { + return token == Token.EndIf + || token == Token.EndProcedure + || token == Token.EndFunction + || token == Token.Else + || token == Token.EndLoop + || token == Token.EndTry + || token == Token.EndOfText + || token == Token.ElseIf; + } } static class SpecialChars diff --git a/src/ScriptEngine/CompilerService.cs b/src/ScriptEngine/CompilerService.cs index 670fbcd49..415bdc8b6 100644 --- a/src/ScriptEngine/CompilerService.cs +++ b/src/ScriptEngine/CompilerService.cs @@ -6,8 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using ScriptEngine.Compiler; using ScriptEngine.Environment; using ScriptEngine.Machine; @@ -29,7 +27,7 @@ internal CompilerService(CompilerContext outerContext) public CodeGenerationFlags ProduceExtraCode { get; set; } - public int DefineVariable(string name, SymbolType type) + public int DefineVariable(string name, string alias, SymbolType type) { RegisterScopeIfNeeded(); @@ -37,9 +35,9 @@ public int DefineVariable(string name, SymbolType type) { int varIdx; if (type == SymbolType.Variable) - varIdx = _currentContext.DefineVariable(name).CodeIndex; + varIdx = _currentContext.DefineVariable(name, alias).CodeIndex; else - varIdx = _currentContext.DefineProperty(name).CodeIndex; + varIdx = _currentContext.DefineProperty(name, alias).CodeIndex; _predefinedVariables.Add(varIdx); return varIdx; diff --git a/src/ScriptEngine/Environment/FileOpener.cs b/src/ScriptEngine/Environment/FileOpener.cs index 47fe237de..7628ce6cb 100644 --- a/src/ScriptEngine/Environment/FileOpener.cs +++ b/src/ScriptEngine/Environment/FileOpener.cs @@ -5,9 +5,7 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; namespace ScriptEngine.Environment @@ -16,18 +14,25 @@ public static class FileOpener { public static StreamReader OpenReader(string filename) { - FileStream input = new FileStream(filename, FileMode.Open, FileAccess.Read); - Encoding enc = AssumeEncoding(input); + return OpenReader(filename, FileShare.ReadWrite); + } + + public static StreamReader OpenReader(string filename, FileShare shareMode, Encoding encoding = null) + { + var input = new FileStream(filename, FileMode.Open, FileAccess.Read, shareMode); - var reader = new StreamReader(input, enc, true); - - return reader; + if (encoding == null) + { + var enc = AssumeEncoding(input); + return new StreamReader(input, enc, true); + } + return new StreamReader(input, encoding); } public static StreamReader OpenReader(string filename, Encoding encoding) { - return new StreamReader(filename, encoding); + return OpenReader(filename, FileShare.ReadWrite, encoding); } public static StreamWriter OpenWriter(string filename) diff --git a/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs b/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs index bfb10300b..bc4f08dab 100755 --- a/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs +++ b/src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs @@ -6,7 +6,6 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; using System.Collections.Generic; -using System.Linq; using System.Text; using ScriptEngine.Environment; using System.Security.Cryptography; @@ -156,12 +155,12 @@ private IRuntimeContextInstance LoadAndCreate(CompilerService compiler, Environm public ScriptModuleHandle CreateModuleFromSource(CompilerService compiler, Environment.ICodeSource code, ExternalContextData externalContext) { - compiler.DefineVariable("ЭтотОбъект", SymbolType.ContextProperty); + compiler.DefineVariable("ЭтотОбъект", "ThisObject", SymbolType.ContextProperty); if (externalContext != null) { foreach (var item in externalContext) { - compiler.DefineVariable(item.Key, SymbolType.ContextProperty); + compiler.DefineVariable(item.Key, null, SymbolType.ContextProperty); } } @@ -190,7 +189,7 @@ public static IRuntimeContextInstance ScriptFactory(string typeName, IValue[] ar var module = _instance._loadedModules[typeName]; var newObj = new UserScriptContextInstance(module, typeName, arguments); - newObj.AddProperty("ЭтотОбъект", newObj); + newObj.AddProperty("ЭтотОбъект", "ThisObject", newObj); newObj.InitOwnData(); newObj.Initialize(_instance._engine.Machine); diff --git a/src/ScriptEngine/Machine/Contexts/AutoContext.cs b/src/ScriptEngine/Machine/Contexts/AutoContext.cs index fb4c8caf0..c4dec83d3 100644 --- a/src/ScriptEngine/Machine/Contexts/AutoContext.cs +++ b/src/ScriptEngine/Machine/Contexts/AutoContext.cs @@ -79,8 +79,28 @@ public override MethodInfo GetMethodInfo(int methodNumber) return _methods.GetMethodInfo(methodNumber); } + private void CheckIfCallIsPossible(int methodNumber, IValue[] arguments) + { + var methodInfo = _methods.GetMethodInfo(methodNumber); + if (!methodInfo.IsDeprecated) + { + return; + } + if (methodInfo.ThrowOnUseDeprecated) + { + throw RuntimeException.DeprecatedMethodCall(methodInfo.Name); + } + if (_warnedDeprecatedMethods.Contains(methodNumber)) + { + return; + } + SystemLogger.Write($"ВНИМАНИЕ! Вызов устаревшего метода {methodInfo.Name}"); + _warnedDeprecatedMethods.Add(methodNumber); + } + public override void CallAsProcedure(int methodNumber, IValue[] arguments) { + CheckIfCallIsPossible(methodNumber, arguments); try { _methods.GetMethod(methodNumber)((TInstance)this, arguments); @@ -94,6 +114,7 @@ public override void CallAsProcedure(int methodNumber, IValue[] arguments) public override void CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue) { + CheckIfCallIsPossible(methodNumber, arguments); try { retValue = _methods.GetMethod(methodNumber)((TInstance)this, arguments); @@ -107,5 +128,6 @@ public override void CallAsFunction(int methodNumber, IValue[] arguments, out IV private static readonly ContextPropertyMapper _properties = new ContextPropertyMapper(); private static readonly ContextMethodsMapper _methods = new ContextMethodsMapper(); + private static readonly HashSet _warnedDeprecatedMethods = new HashSet(); } } diff --git a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs index 58fb23088..d7295eaeb 100644 --- a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs @@ -24,12 +24,38 @@ public COMWrapperContext() } + private static Type FindTypeByName(string typeName) + { + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Reverse()) + { + var tt = assembly.GetType(typeName, throwOnError:false, ignoreCase:true); + if (tt != null) + { + return tt; + } + } + return Type.GetType(typeName, throwOnError:false, ignoreCase:true); + } + public static COMWrapperContext Create(string progId, IValue[] arguments) { - var type = Type.GetType(progId, throwOnError: false, ignoreCase: true); + Type type = null; + try + { + type = Type.GetTypeFromProgID(progId, throwOnError: false); + } + catch (NotImplementedException) + { + // В Mono GetTypeFromProgID бросает такое исключение. + } + if (type == null) + { + type = FindTypeByName(progId); + } + if (type == null) { - type = Type.GetTypeFromProgID(progId, throwOnError: true); + throw new TypeLoadException(String.Format("Тип {0} не найден!", progId)); } if (type.IsGenericType) diff --git a/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs b/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs index 43773604e..0a7a26ddc 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextMethodMapper.cs @@ -7,17 +7,16 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using System.Text; namespace ScriptEngine.Machine.Contexts { - [AttributeUsage(AttributeTargets.Method)] + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public class ContextMethodAttribute : Attribute { private readonly string _name; private readonly string _alias; - public ContextMethodAttribute(string name, string alias = "") + public ContextMethodAttribute(string name, string alias = null, bool isDeprecated = false, bool throwOnUse = false) { if(!Utils.IsValidIdentifier(name)) throw new ArgumentException("Name must be a valid identifier"); @@ -27,6 +26,13 @@ public ContextMethodAttribute(string name, string alias = "") _name = name; _alias = alias; + IsDeprecated = isDeprecated; + ThrowOnUse = throwOnUse; + } + + public ContextMethodAttribute(string name, bool isDeprecated) + : this(name, null, isDeprecated) + { } public string GetName() @@ -38,6 +44,10 @@ public string GetAlias() { return _alias; } + + public bool IsDeprecated { get; } + + public bool ThrowOnUse { get; } public bool IsFunction { get; set; } } @@ -51,27 +61,53 @@ public class ByRefAttribute : Attribute public class ContextMethodsMapper { - private readonly List _methodPtrs = new List(); + private List _methodPtrs; - public ContextMethodsMapper() + private void Init() { - MapType(typeof(TInstance)); + if (_methodPtrs == null) + { + lock (this) + { + if (_methodPtrs == null) + { + _methodPtrs = new List(); + MapType(typeof(TInstance)); + } + } + } } public ContextCallableDelegate GetMethod(int number) { + Init(); return _methodPtrs[number].method; } public ScriptEngine.Machine.MethodInfo GetMethodInfo(int number) { + Init(); return _methodPtrs[number].methodInfo; } + public IEnumerable GetMethods() + { + Init(); + return _methodPtrs.Select(x => x.methodInfo); + } + public int FindMethod(string name) { - name = name.ToLower(); - var idx = _methodPtrs.FindIndex(x => x.methodInfo.Name == name || x.methodInfo.Alias == name); + Init(); + + // поскольку этот метод вызывается довольно часто, то тут + // возможна некоторая просадка по производительности + // за счет сравнения IgnoreCase вместо обычного "числового" сравнения + // Надо будет понаблюдать или вообще замерить + // + var idx = _methodPtrs.FindIndex(x => + String.Compare(x.methodInfo.Name, name, StringComparison.OrdinalIgnoreCase) == 0 + || String.Compare(x.methodInfo.Alias, name, StringComparison.OrdinalIgnoreCase) == 0 ); if (idx < 0) { throw RuntimeException.MethodNotFoundException(name); @@ -84,6 +120,7 @@ public int Count { get { + Init(); return _methodPtrs.Count; } } @@ -91,11 +128,12 @@ public int Count private void MapType(Type type) { var methods = type.GetMethods() - .Where(x => x.GetCustomAttributes(typeof(ContextMethodAttribute), false).Any()) - .Select(x => new { - Method = x, - Binding = (ContextMethodAttribute)x.GetCustomAttributes(typeof(ContextMethodAttribute), false)[0] - }); + .SelectMany(method => method.GetCustomAttributes(typeof(ContextMethodAttribute), false) + .Select(attr => new { + Method = method, + Binding = (ContextMethodAttribute) attr + }) + ); foreach (var item in methods) { @@ -146,10 +184,12 @@ private void MapType(Type type) var scriptMethInfo = new ScriptEngine.Machine.MethodInfo(); scriptMethInfo.IsFunction = isFunc; - scriptMethInfo.Name = item.Binding.GetName().ToLower(); + scriptMethInfo.IsDeprecated = item.Binding.IsDeprecated; + scriptMethInfo.ThrowOnUseDeprecated = item.Binding.ThrowOnUse; + scriptMethInfo.Name = item.Binding.GetName(); scriptMethInfo.Alias = string.IsNullOrEmpty(item.Binding.GetAlias()) ? scriptMethInfo.Name - :item.Binding.GetAlias().ToLower(); + :item.Binding.GetAlias(); scriptMethInfo.Params = paramDefs; diff --git a/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs b/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs index 63c037d2e..af0c3a380 100644 --- a/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs +++ b/src/ScriptEngine/Machine/Contexts/ContextPropertyMapper.cs @@ -168,9 +168,15 @@ public class ContextPropertyMapper { private List> _properties; - public ContextPropertyMapper() + public void Init() { - FindProperties(); + if (_properties != null) return; + + lock (this) + { + if(_properties == null) + FindProperties(); + } } private void FindProperties() @@ -182,7 +188,9 @@ private void FindProperties() public int FindProperty(string name) { - var idx = _properties.FindIndex(x => x.Name.ToLower() == name.ToLower() || x.Alias.ToLower() == name.ToLower()); + Init(); + var idx = _properties.FindIndex(x => String.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase) + || String.Equals(x.Alias, name, StringComparison.OrdinalIgnoreCase)); if (idx < 0) throw RuntimeException.PropNotFoundException(name); @@ -191,6 +199,7 @@ public int FindProperty(string name) public PropertyTarget GetProperty(int index) { + Init(); return _properties[index]; } @@ -198,8 +207,28 @@ public int Count { get { + Init(); return _properties.Count; } } + + public IEnumerable GetProperties() + { + Init(); + var infos = new VariableInfo[Count]; + for (int i = 0; i < infos.Length; i++) + { + var prop = _properties[i]; + infos[i] = new VariableInfo() + { + Identifier = prop.Name, + Alias = prop.Alias, + Type = SymbolType.ContextProperty, + Index = i + }; + } + + return infos; + } } } diff --git a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs index 40a7c095e..0b280dbb8 100644 --- a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs +++ b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs @@ -7,8 +7,6 @@ This Source Code Form is subject to the terms of the using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using ScriptEngine.Machine.Contexts; namespace ScriptEngine.Machine.Contexts { @@ -84,8 +82,8 @@ protected override void OnInstanceCreation() } } } - - public void AddProperty(string name, IValue value) + + public void AddProperty(string name, string alias, IValue value) { if(_ownProperties == null) { @@ -95,10 +93,19 @@ public void AddProperty(string name, IValue value) var newIndex = _ownProperties.Count; _ownPropertyIndexes.Add(name, newIndex); + if (!string.IsNullOrEmpty(alias)) + { + _ownPropertyIndexes.Add(alias, newIndex); + } _ownProperties.Add(value); } + public void AddProperty(string name, IValue value) + { + AddProperty(name, null, value); + } + protected override int GetOwnMethodCount() { return 0; diff --git a/src/ScriptEngine/Machine/Core.cs b/src/ScriptEngine/Machine/Core.cs index 43f204b40..51fbf6abe 100644 --- a/src/ScriptEngine/Machine/Core.cs +++ b/src/ScriptEngine/Machine/Core.cs @@ -162,7 +162,7 @@ public enum DataType } [Serializable] - struct ConstDefinition + struct ConstDefinition : IEquatable { public DataType Type; public string Presentation; @@ -171,6 +171,11 @@ public override string ToString() { return Enum.GetName(typeof(DataType), Type) + ":" + Presentation; } + + public bool Equals(ConstDefinition other) + { + return Type == other.Type && string.Equals(Presentation, other.Presentation, StringComparison.Ordinal); + } } @@ -180,6 +185,8 @@ public struct MethodInfo public string Name; public string Alias; public bool IsFunction; + public bool IsDeprecated; + public bool ThrowOnUseDeprecated; public ParameterDefinition[] Params; public int ArgCount @@ -200,6 +207,11 @@ public struct ParameterDefinition public int DefaultValueIndex; public const int UNDEFINED_VALUE_INDEX = -1; + + public bool IsDefaultValueDefined() + { + return HasDefaultValue && DefaultValueIndex != UNDEFINED_VALUE_INDEX; + } } public struct TypeDescriptor : IEquatable @@ -248,6 +260,7 @@ public struct VariableInfo { public int Index; public string Identifier; + public string Alias; public SymbolType Type; } diff --git a/src/ScriptEngine/Machine/IndexedNamesCollection.cs b/src/ScriptEngine/Machine/IndexedNamesCollection.cs index 268c62cba..4fb3afd4a 100644 --- a/src/ScriptEngine/Machine/IndexedNamesCollection.cs +++ b/src/ScriptEngine/Machine/IndexedNamesCollection.cs @@ -11,7 +11,7 @@ This Source Code Form is subject to the terms of the namespace ScriptEngine.Machine { - class IndexedNamesCollection + public class IndexedNamesCollection { private readonly List _names = new List(); private readonly Dictionary _nameIndexes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index 83db0975d..8e1df3f9d 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -45,6 +45,7 @@ private struct ExceptionJumpInfo { public int handlerAddress; public ExecutionFrame handlerFrame; + public int stackSize; } public void AttachContext(IAttachableContext context, bool detachable) @@ -264,8 +265,10 @@ private IValue GetDefaultArgValue(int methodIndex, int paramIndex) { var meth = _module.Methods[methodIndex].Signature; var param = meth.Params[paramIndex]; - if (!param.HasDefaultValue) - throw new ApplicationException("Invalid script arguments"); + if (!param.IsDefaultValueDefined()) + { + return ValueFactory.Create(); + } return _module.Constants[param.DefaultValueIndex]; } @@ -418,6 +421,12 @@ private void ExecuteCode() _currentFrame.InstructionPointer = handler.handlerAddress; _currentFrame.LastException = exc; + + // При возникновении исключения посредине выражения + // некому почистить стек операндов. + // Сделаем это + while (_operationStack.Count > handler.stackSize) + _operationStack.Pop(); } @@ -843,11 +852,13 @@ private bool MethodCallImpl(int arg, bool asFunc) { if (i < methInfo.Params.Length) { - var constId = methInfo.Params[i].DefaultValueIndex; - if (constId == ParameterDefinition.UNDEFINED_VALUE_INDEX) + if (!methInfo.Params[i].IsDefaultValueDefined()) argValue = null; else + { + var constId = methInfo.Params[i].DefaultValueIndex; argValue = _module.Constants[constId]; + } } else { @@ -894,15 +905,19 @@ private bool MethodCallImpl(int arg, bool asFunc) frame.Locals[i] = Variable.CreateReference((IVariable)argValues[i], methDescr.Variables[i]); } } + else if (argValues[i] == null) + { + frame.Locals[i] = Variable.Create(ValueFactory.Create(), methDescr.Variables[i]); + } else { frame.Locals[i] = Variable.Create(argValues[i], methDescr.Variables[i]); } } - else if (i < methInfo.Params.Length && methInfo.Params[i].HasDefaultValue) + else if (i < methInfo.Params.Length) { - if (methInfo.Params[i].DefaultValueIndex == ParameterDefinition.UNDEFINED_VALUE_INDEX) + if (!methInfo.Params[i].IsDefaultValueDefined()) { frame.Locals[i] = Variable.Create(ValueFactory.Create(), methDescr.Variables[i]); } @@ -1116,20 +1131,9 @@ private void CheckFactArguments(MethodInfo methInfo, bool[] argsPassed) throw RuntimeException.TooManyArgumentsPassed(); } - for (int i = 0; i < methInfo.Params.Length; i++) + if (methInfo.Params.Skip(argsPassed.Length).Any(param => !param.HasDefaultValue)) { - var paramDef = methInfo.Params[i]; - if (i < argsPassed.Length) - { - if (argsPassed[i] == false && !paramDef.HasDefaultValue) - { - throw RuntimeException.ArgHasNoDefaultValue(i + 1); - } - } - else if (!paramDef.HasDefaultValue) - { - throw RuntimeException.TooLittleArgumentsPassed(); - } + throw RuntimeException.TooLittleArgumentsPassed(); } } @@ -1286,12 +1290,7 @@ private void NewInstance(int argCount) if (argValues[i].DataType == DataType.NotAValidValue) { - if (parameters[i].IsOptional) - argsToPass.Add(null); - else - { - throw RuntimeException.ArgHasNoDefaultValue(i + 1); - } + argsToPass.Add(null); } else argsToPass.Add(argValues[i]); @@ -1397,6 +1396,7 @@ private void BeginTry(int exceptBlockAddress) var info = new ExceptionJumpInfo(); info.handlerAddress = exceptBlockAddress; info.handlerFrame = _currentFrame; + info.stackSize = _operationStack.Count; _exceptionsStack.Push(info); NextInstruction(); diff --git a/src/ScriptEngine/Machine/MachineStopManager.cs b/src/ScriptEngine/Machine/MachineStopManager.cs index 4113c9bba..4ce409e88 100644 --- a/src/ScriptEngine/Machine/MachineStopManager.cs +++ b/src/ScriptEngine/Machine/MachineStopManager.cs @@ -81,6 +81,12 @@ public bool ShouldStopAtThisLine(string module, ExecutionFrame currentFrame) case DebugState.SteppingOut: case DebugState.SteppingOver: mustStop = FrameIsInStopList(currentFrame); + // по пути следования все равно может встретиться breakpoint + if (!mustStop && HitBreakpointOnLine(module, currentFrame)) + { + _currentState = DebugState.Running; //для правильной причины останова (см. ниже) + mustStop = true; + } break; } diff --git a/src/ScriptEngine/Machine/RuntimeExceptions.cs b/src/ScriptEngine/Machine/RuntimeExceptions.cs index c4a958726..b2bad9917 100644 --- a/src/ScriptEngine/Machine/RuntimeExceptions.cs +++ b/src/ScriptEngine/Machine/RuntimeExceptions.cs @@ -26,6 +26,11 @@ public RuntimeException(string msg, Exception inner) { } + public static RuntimeException DeprecatedMethodCall(string name) + { + return new RuntimeException($"Вызов безнадёжно устаревшего метода {name}"); + } + public static RuntimeException ConvertToNumberException() { return new RuntimeException("Преобразование к типу 'Число' не поддерживается"); @@ -76,11 +81,6 @@ public static RuntimeException TooLittleArgumentsPassed() return new RuntimeException("Недостаточно фактических параметров"); } - public static RuntimeException ArgHasNoDefaultValue(int argNum) - { - return new RuntimeException(string.Format("Аргумент {0} не имеет значения по умолчанию", argNum)); - } - public static RuntimeException InvalidArgumentType() { return new RuntimeException("Неверный тип аргумента"); diff --git a/src/ScriptEngine/RuntimeEnvironment.cs b/src/ScriptEngine/RuntimeEnvironment.cs index aa152c64a..e19e9027c 100644 --- a/src/ScriptEngine/RuntimeEnvironment.cs +++ b/src/ScriptEngine/RuntimeEnvironment.cs @@ -110,7 +110,7 @@ public IEnumerable GetUserAddedScripts() return _externalScripts; } - private void RegisterSymbolScope(IAttachableContext provider, bool asDynamicScope) + private void RegisterSymbolScope(IRuntimeContextInstance provider, bool asDynamicScope) { var scope = new SymbolScope(); scope.IsDynamicScope = asDynamicScope; diff --git a/src/ScriptEngine/ScriptEngine.csproj b/src/ScriptEngine/ScriptEngine.csproj index 0e24a605b..ed8a2d7b8 100644 --- a/src/ScriptEngine/ScriptEngine.csproj +++ b/src/ScriptEngine/ScriptEngine.csproj @@ -1,4 +1,4 @@ - + @@ -86,10 +86,6 @@ false - - ..\packages\Newtonsoft.Json.10.0.2\lib\net40\Newtonsoft.Json.dll - True - @@ -229,4 +225,4 @@ --> - + \ No newline at end of file diff --git a/src/ScriptEngine/ScriptingEngine.cs b/src/ScriptEngine/ScriptingEngine.cs index 4f96e55ca..a659632ac 100644 --- a/src/ScriptEngine/ScriptingEngine.cs +++ b/src/ScriptEngine/ScriptingEngine.cs @@ -100,7 +100,7 @@ public LoadedModuleHandle LoadModuleImage(ScriptModuleHandle moduleImage) internal IRuntimeContextInstance NewObject(LoadedModule module, ExternalContextData externalContext = null) { var scriptContext = new Machine.Contexts.UserScriptContextInstance(module, "Сценарий"); - scriptContext.AddProperty("ЭтотОбъект", scriptContext); + scriptContext.AddProperty("ЭтотОбъект", "ThisObject", scriptContext); if (externalContext != null) { foreach (var item in externalContext) diff --git a/src/TestWebApp/ApplicationInsights.config b/src/TestWebApp/ApplicationInsights.config new file mode 100644 index 000000000..ee9ea3c04 --- /dev/null +++ b/src/TestWebApp/ApplicationInsights.config @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + System.Web.Handlers.TransferRequestHandler + Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler + System.Web.StaticFileHandler + System.Web.Handlers.AssemblyResourceLoader + System.Web.Optimization.BundleHandler + System.Web.Script.Services.ScriptHandlerFactory + System.Web.Handlers.TraceHandler + System.Web.Services.Discovery.DiscoveryRequestHandler + System.Web.HttpDebugHandler + + + + + + + + 5 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestWebApp/Default.os b/src/TestWebApp/Default.os new file mode 100644 index 000000000..914d9c150 --- /dev/null +++ b/src/TestWebApp/Default.os @@ -0,0 +1,56 @@ + +// Это предопределенная функция - обработчик запроса HTTP-сервиса +// +Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт + + Если Запрос.HTTPМетод = "GET" Тогда + + Возврат ПоказатьГлавнуюСтраницу(Запрос); + + Иначе + + Возврат ПоказатьИсходныйКод(Запрос); + + КонецЕсли; + +КонецФункции + +Функция ПоказатьГлавнуюСтраницу(Запрос) + + Контекст = Запрос.Контекст; + + ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Default.ospt"); + СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона); + СтрокаТело = СтрЗаменить(СтрокаШаблон, "{ClientAddress}", Контекст.АдресКлиента); + Ответ = Новый HTTPСервисОтвет(200); + Ответ.УстановитьТелоИзСтроки(СтрокаТело); + + Возврат Ответ; + +КонецФункции + +Функция ПоказатьИсходныйКод(Запрос) + + Контекст = Запрос.Контекст; + + СтрокаИсходныйКод = ПолучитьМакетСтраницы(Контекст.ФизическийПуть); + + ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Source.ospt"); + СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона); + + СтрокаТело = СтрЗаменить(СтрокаШаблон, "{SourceCode}", СтрокаИсходныйКод); + + Ответ = Новый HTTPСервисОтвет(200); + Ответ.УстановитьТелоИзСтроки(СтрокаТело); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьМакетСтраницы(ПутьКФайлу) + + Документ = Новый ТекстовыйДокумент; + Документ.Прочитать(ПутьКФайлу); + Возврат Документ.ПолучитьТекст(); + +КонецФункции \ No newline at end of file diff --git a/src/TestWebApp/Default.ospt b/src/TestWebApp/Default.ospt new file mode 100644 index 000000000..892c1dce3 --- /dev/null +++ b/src/TestWebApp/Default.ospt @@ -0,0 +1,24 @@ + + + + + + OneScript HTTP Service Test Page + + + +
+

Привет ({ClientAddress})!

+

Эта страница создана HTTP сервисом OneScript.

+
+
+
+
+ + +
+
+
+ + + \ No newline at end of file diff --git a/src/TestWebApp/Properties/AssemblyInfo.cs b/src/TestWebApp/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..92489d081 --- /dev/null +++ b/src/TestWebApp/Properties/AssemblyInfo.cs @@ -0,0 +1,42 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TestWebApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TestWebApp")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6de97986-8304-45ae-bd47-63a5563f9c3a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/TestWebApp/TestWebApp.csproj b/src/TestWebApp/TestWebApp.csproj new file mode 100644 index 000000000..b5eb0accd --- /dev/null +++ b/src/TestWebApp/TestWebApp.csproj @@ -0,0 +1,117 @@ + + + + + + + Debug + AnyCPU + + + 2.0 + {6DE97986-8304-45AE-BD47-63A5563F9C3A} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + TestWebApp + TestWebApp + v4.5.2 + true + + enabled + disabled + true + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + PreserveNewest + + + + + + Web.config + + + Web.config + + + + + + + + + Designer + + + + + + + + {b7cd7f52-e387-490e-8f77-e1fb060401b5} + HTTPServices + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 50950 + / + http://localhost:50685/ + False + False + + + False + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/src/TestWebApp/Web.Debug.config b/src/TestWebApp/Web.Debug.config new file mode 100644 index 000000000..2e302f9f9 --- /dev/null +++ b/src/TestWebApp/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/TestWebApp/Web.Release.config b/src/TestWebApp/Web.Release.config new file mode 100644 index 000000000..c35844462 --- /dev/null +++ b/src/TestWebApp/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestWebApp/Web.config b/src/TestWebApp/Web.config new file mode 100644 index 000000000..8abed2de7 --- /dev/null +++ b/src/TestWebApp/Web.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/TestWebApp/images/home.png b/src/TestWebApp/images/home.png new file mode 100644 index 000000000..a1686704c Binary files /dev/null and b/src/TestWebApp/images/home.png differ diff --git a/src/TestWebApp/images/viewsrc.jpg b/src/TestWebApp/images/viewsrc.jpg new file mode 100644 index 000000000..98b37e43a Binary files /dev/null and b/src/TestWebApp/images/viewsrc.jpg differ diff --git a/src/TestWebApp/packages.config b/src/TestWebApp/packages.config new file mode 100644 index 000000000..dc83cae95 --- /dev/null +++ b/src/TestWebApp/packages.config @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestWebApp/scripts/highlight.pack.js b/src/TestWebApp/scripts/highlight.pack.js new file mode 100644 index 000000000..2b63060fe --- /dev/null +++ b/src/TestWebApp/scripts/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("1c",function(s){var x="[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+",o="далее ",m="возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ",t=o+m,l="загрузитьизфайла ",e="вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ",n=l+e,a="разделительстраниц разделительстрок символтабуляции ",d="ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон ",i="acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища ",c="wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ",r=a+d+i+c,p="webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля ",b="автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени форматкартинки ширинаподчиненныхэлементовформы ",w="виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента ",h="авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных ",j="использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц ",z="отображениевремениэлементовпланировщика ",f="типфайлаформатированногодокумента ",k="обходрезультатазапроса типзаписизапроса ",u="видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов ",y="доступкфайлу режимдиалогавыборафайла режимоткрытияфайла ",N="типизмеренияпостроителязапроса ",g="видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений ",E="wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs форматдатыjson экранированиесимволовjson ",M="видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных использованиеусловногооформлениякомпоновкиданных ",_="важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты статусразборапочтовогосообщения ",v="режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации ",A="расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии типхранилищасертификатовкриптографии ",C="кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip режимсохраненияпутейzip уровеньсжатияzip ",L="звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp ",Z="направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса ",$="httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса типномерадокумента типномеразадачи типформы удалениедвижений ",q="важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты",B=p+b+w+h+j+z+f+k+u+y+N+g+E+M+_+v+A+C+L+Z+$+q,I="comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных ",P="comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура фиксированноесоответствие фиксированныймассив ",T=I+P,W="null истина ложь неопределено",D=s.inherit(s.NM),F={cN:"string",b:'"|\\|',e:'"|$',c:[{b:'""'}]},G={b:"'",e:"'",eB:!0,eE:!0,c:[{cN:"number",b:"\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}"}]},H=s.inherit(s.CLCM),J={cN:"meta",l:x,b:"#|&",e:"$",k:{"meta-keyword":t+n},c:[H]},K={cN:"symbol",b:"~",e:";|:",eE:!0},O={cN:"function",l:x,v:[{b:"процедура|функция",e:"\\)",k:"процедура функция"},{b:"конецпроцедуры|конецфункции",k:"конецпроцедуры конецфункции"}],c:[{b:"\\(",e:"\\)",endsParent:!0,c:[{cN:"params",l:x,b:x,e:",",eE:!0,eW:!0,k:{keyword:"знач",literal:W},c:[D,F,G]},H]},s.inherit(s.TM,{b:x})]};return{cI:!0,l:x,k:{keyword:t,built_in:r,"class":B,type:T,literal:W},c:[J,O,H,K,D,F,G]}}); \ No newline at end of file diff --git a/src/TestWebApp/source.ospt b/src/TestWebApp/source.ospt new file mode 100644 index 000000000..462b2ab24 --- /dev/null +++ b/src/TestWebApp/source.ospt @@ -0,0 +1,25 @@ + + + + + + OneScript HTTP Service Test Page + + + + + + + + +
+ + Go to W3Schools! + +
+

+            {SourceCode}
+        
+ + + \ No newline at end of file diff --git a/src/TestWebApp/styles/github.css b/src/TestWebApp/styles/github.css new file mode 100644 index 000000000..791932b87 --- /dev/null +++ b/src/TestWebApp/styles/github.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/src/UpgradeLog.htm b/src/UpgradeLog.htm new file mode 100644 index 000000000..b09e4c356 Binary files /dev/null and b/src/UpgradeLog.htm differ diff --git a/src/oscript/DebugServer/OscriptDebugController.cs b/src/oscript/DebugServer/OscriptDebugController.cs index 3d71b0408..538a234b5 100644 --- a/src/oscript/DebugServer/OscriptDebugController.cs +++ b/src/oscript/DebugServer/OscriptDebugController.cs @@ -129,7 +129,11 @@ public Breakpoint[] SetMachineBreakpoints(Breakpoint[] breaksToSet) foreach (var item in grouped) { - var lines = item.Select(x => x.Line).ToArray(); + var lines = item + .Where(x=>x.Line != 0) + .Select(x => x.Line) + .ToArray(); + _machine.SetBreakpointsForModule(item.Key, lines); foreach (var line in lines) diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os index ad846b7aa..6c8211959 100644 --- a/tests/engine-behaviors.os +++ b/tests/engine-behaviors.os @@ -16,6 +16,7 @@ ВсеТесты = Новый Массив; + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаполненностьЗначений"); ВсеТесты.Добавить("ТестДолженПроверитьИсключенияИдущиеДругЗаДругом"); ВсеТесты.Добавить("ТестДолжен_ВызватьФункциюКакПроцедуру_Issue104"); ВсеТесты.Добавить("ТестДолжен_ПрочитатьЛитералДатыСРазделителями"); @@ -42,6 +43,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюКлючевыхСловВСвойствахСтруктуры"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоАргументыКоманднойСтрокиЭтоФиксированныйМассив"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСкриптаИзСтроки"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПропускПараметров"); Возврат ВсеТесты; @@ -419,3 +421,74 @@ юТест.ПроверитьРавенство(Вычислятель.Коэффициент, 3.1415, "Получение поля из скрипта-строки"); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗаполненностьЗначений() Экспорт + + юТест.ПроверитьИстину(ЗначениеЗаполнено(1)); + юТест.ПроверитьИстину(ЗначениеЗаполнено(Истина)); + юТест.ПроверитьИстину(ЗначениеЗаполнено(Ложь)); + юТест.ПроверитьИстину(ЗначениеЗаполнено(ТекущаяДата())); + юТест.ПроверитьИстину(ЗначениеЗаполнено("123")); + юТест.ПроверитьИстину(ЗначениеЗаполнено(Новый Структура("СКлючом"))); + + юТест.ПроверитьЛожь(ЗначениеЗаполнено(Неопределено)); + юТест.ПроверитьЛожь(ЗначениеЗаполнено(Null)); + юТест.ПроверитьЛожь(ЗначениеЗаполнено("")); + юТест.ПроверитьЛожь(ЗначениеЗаполнено(0)); + юТест.ПроверитьЛожь(ЗначениеЗаполнено('00010101')); + юТест.ПроверитьЛожь(ЗначениеЗаполнено(Новый Массив)); + юТест.ПроверитьЛожь(ЗначениеЗаполнено(Новый Структура)); + юТест.ПроверитьЛожь(ЗначениеЗаполнено(Новый Соответствие)); + +КонецПроцедуры + +Функция ПропущенныеПараметры1(П1, П2, П3 = "1") + + Возврат Новый Структура("П1, П2, П3", П1, П2, П3); + +КонецФункции + +Процедура ТестДолжен_ПроверитьПропускПараметров() Экспорт + + П = ПропущенныеПараметры1(,); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(,,); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(, 2); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(3,); + юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(3,,); + юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(,,"4"); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "4", "Параметр со значением по-умолчанию"); + + + П = ПропущенныеПараметры1(, 2, "6"); + юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию"); + юТест.ПроверитьРавенство(П.П3, "6", "Параметр со значением по-умолчанию"); + +КонецПроцедуры diff --git a/tests/managed-com.os b/tests/managed-com.os index dcfd4044a..ab0900ed0 100644 --- a/tests/managed-com.os +++ b/tests/managed-com.os @@ -21,7 +21,10 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеClrКоллекцииШаблона"); ВсеТесты.Добавить("ТестДолжен_ПроверитьТипыClrОбъектов"); ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetType"); - + ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляЭлементовСписка"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляCLRКоллекции"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуТипаНеИзЯдра"); + Возврат ВсеТесты; КонецФункции @@ -103,42 +106,73 @@ КонецПроцедуры -Процедура РазделитьТипИПространствоИмен(Знач ПолноеИмя, ПространствоИмен, Имя) +Процедура ПроверитьРаботуGetTypeДляОдногоТипа(ИмяПроверяемогоТипаИлиОбъект, ПространствоИмен, Имя, ЭтоОбъект = Ложь) Экспорт + + Если ТипЗнч(ИмяПроверяемогоТипаИлиОбъект) = Тип("Строка") И НЕ ЭтоОбъект Тогда + ИмяПроверяемогоТипа = ИмяПроверяемогоТипаИлиОбъект; + Объект = Новый COMОбъект(ИмяПроверяемогоТипа); + Иначе + Объект = ИмяПроверяемогоТипаИлиОбъект; + юТест.ПроверитьРавенство(ТипЗнч(Объект), Тип("COMОбъект"), "Объект как COM-объект"); + КонецЕсли; + + Рефлектор = Новый Рефлектор; - М = СтрРазделить(ПолноеИмя, "."); - Имя = М.Получить(М.ВГраница()); + юТест.ПроверитьИстину(Рефлектор.МетодСуществует(Объект, "GetType"), "Существует метод `GetType()`, Имя типа " + ИмяПроверяемогоТипа); + + ТипОбъекта = Объект.GetType(); - М.Удалить(М.ВГраница()); + юТест.ПроверитьРавенство(ТипЗнч(ТипОбъекта), Тип("COMОбъект"), "Тип - COM-объект " + ИмяПроверяемогоТипа); - ПространствоИмен = СтрСоединить(М, "."); + юТест.ПроверитьРавенство(ВРЕГ(ПространствоИмен), ВРЕГ(ТипОбъекта.Namespace), "Получили тот тип, который просили " + ИмяПроверяемогоТипа); + юТест.ПроверитьРавенство(ВРЕГ(Имя), ВРЕГ(ТипОбъекта.Name), "Получили тот тип, который просили " + ИмяПроверяемогоТипа); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьРаботуGetType() Экспорт + ПроверитьРаботуGetTypeДляОдногоТипа("System.Random", "System", "Random"); + ПроверитьРаботуGetTypeДляОдногоТипа("System.Collections.ArrayList", "System.Collections", "ArrayList"); + ПроверитьРаботуGetTypeДляОдногоТипа("System.Collections.Generic.List`1", "System.Collections.Generic", "List`1"); + ПроверитьРаботуGetTypeДляОдногоТипа("System.Collections.Generic.Dictionary`2", "System.Collections.Generic", "Dictionary`2"); + КонецПроцедуры -Процедура ПроверитьПолучениеТипаКомОбъекта(Знач ИмяПроверяемогоТипа) +Процедура ТестДолжен_ПроверитьРаботуGetTypeДляЭлементовСписка() Экспорт - Перем ПространствоИмен, Имя; + РоднаяКоллекция = Новый COMОбъект("System.Collections.ArrayList"); + РоднаяКоллекция.Add(1); + РоднаяКоллекция.Add("string"); + РоднаяКоллекция.Add('20170808'); + РоднаяКоллекция.Add(Новый COMОбъект("System.Random")); - РазделитьТипИПространствоИмен(ИмяПроверяемогоТипа, ПространствоИмен, Имя); + юТест.ПроверитьРавенство(ТипЗнч(РоднаяКоллекция[0]), Тип("Число"), "Элемент [0] - это число"); + юТест.ПроверитьРавенство(ТипЗнч(РоднаяКоллекция[1]), Тип("Строка"), "Элемент [1] - это строка"); + юТест.ПроверитьРавенство(ТипЗнч(РоднаяКоллекция[2]), Тип("Дата"), "Элемент [2] - это дата"); + ПроверитьРаботуGetTypeДляОдногоТипа(РоднаяКоллекция[3], "System", "Random"); - Объект = Новый COMОбъект(ИмяПроверяемогоТипа); - Рефлектор = Новый Рефлектор; +КонецПроцедуры - юТест.ПроверитьИстину(Рефлектор.МетодСуществует(Объект, "GetType"), "Существует метод `GetType()`"); - - ТипОбъекта = Объект.GetType(); +Процедура ТестДолжен_ПроверитьРаботуGetTypeДляCLRКоллекции() Экспорт - юТест.ПроверитьРавенство(ТипЗнч(ТипОбъекта), Тип("COMОбъект"), "Тип - COM-объект"); + РоднаяКоллекция = Новый ComОбъект("System.Collections.Generic.Dictionary`2"); + РоднаяКоллекция.Add("str", 123); - юТест.ПроверитьРавенство(ВРЕГ(ПространствоИмен), ВРЕГ(ТипОбъекта.Namespace), "Получили тот тип, который просили"); - юТест.ПроверитьРавенство(ВРЕГ(Имя), ВРЕГ(ТипОбъекта.Name), "Получили тот тип, который просили"); + Для Каждого мКлючЗначение Из РоднаяКоллекция Цикл + юТест.ПроверитьРавенство(ТипЗнч(мКлючЗначение), Тип("COMОбъект"), "CLR-тип как COM-объект"); + + ПроверитьРаботуGetTypeДляОдногоТипа(мКлючЗначение, "System.Collections.Generic", "KEYVALUEPAIR`2"); + юТест.ПроверитьРавенство(ТипЗнч(мКлючЗначение.Key), Тип("Строка"), "мКлючЗначение.Key - это строка"); + юТест.ПроверитьРавенство(ТипЗнч(мКлючЗначение.Value), Тип("Число"), "мКлючЗначение.Value - это число"); + КонецЦикла; + КонецПроцедуры -Процедура ТестДолжен_ПроверитьРаботуGetType() Экспорт +Процедура ТестДолжен_ПроверитьРаботуТипаНеИзЯдра() Экспорт + + Ури = Новый COMОбъект("System.Uri", "file:///some/file.txt"); // тип НЕ из mscorlib.dll. Должен просто создаться и не упасть + юТест.ПроверитьРавенство(Ури.IsFile, Истина); + ПроверитьРаботуGetTypeДляОдногоТипа(Ури, "System", "Uri"); - ПроверитьПолучениеТипаКомОбъекта("System.Random"); - ПроверитьПолучениеТипаКомОбъекта("System.Collections.ArrayList"); - ПроверитьПолучениеТипаКомОбъекта("System.Collections.Generic.List`1"); - ПроверитьПолучениеТипаКомОбъекта("System.Collections.Generic.Dictionary`2"); - КонецПроцедуры diff --git a/tests/reflector.os b/tests/reflector.os index d588c5845..f5c3f7754 100644 --- a/tests/reflector.os +++ b/tests/reflector.os @@ -24,6 +24,9 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуСвойств"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаСПараметрамиПоУмолчанию"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСуществуетДляТипа"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуМетодовДляТипа"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляТипа"); Возврат ВсеТесты; КонецФункции @@ -138,15 +141,15 @@ юТест.ПроверитьРавенство(Строка(ТипЗнч(ТаблицаМетодов)), "ТаблицаЗначений", "ТаблицаМетодов"); юТест.ПроверитьРавенство(5, ТаблицаМетодов.Количество(), "ТаблицаМетодов.Количество()"); - Метод0 = ТаблицаМетодов.Найти("вставить", "Имя"); + Метод0 = ТаблицаМетодов.Найти("Вставить", "Имя"); юТест.ПроверитьНеРавенство(Неопределено, Метод0, "Метод0"); - юТест.ПроверитьРавенство("вставить", Метод0.Имя, "Метод0.Имя"); + юТест.ПроверитьРавенство("Вставить", Метод0.Имя, "Метод0.Имя"); юТест.ПроверитьРавенство(2, Метод0.КоличествоПараметров, "Метод0.КоличествоПараметров"); юТест.ПроверитьРавенство(Ложь, Метод0.ЭтоФункция, "Метод0.ЭтоФункция"); - Метод4 = ТаблицаМетодов.Найти("очистить", "Имя"); + Метод4 = ТаблицаМетодов.Найти("Очистить", "Имя"); юТест.ПроверитьНеРавенство(Неопределено, Метод4, "Метод4"); - юТест.ПроверитьРавенство("очистить", Метод4.Имя, "Метод4.Имя"); + юТест.ПроверитьРавенство("Очистить", Метод4.Имя, "Метод4.Имя"); юТест.ПроверитьРавенство(0, Метод4.КоличествоПараметров, "Метод4.КоличествоПараметров"); юТест.ПроверитьРавенство(Ложь, Метод4.ЭтоФункция, "Метод4.ЭтоФункция"); @@ -162,15 +165,15 @@ юТест.ПроверитьРавенство(Строка(ТипЗнч(ТаблицаМетодов)), "ТаблицаЗначений", "ТаблицаМетодов"); юТест.ПроверитьРавенство(5, ТаблицаМетодов.Количество(), "ТаблицаМетодов.Количество()"); - Метод0 = ТаблицаМетодов.Найти("вставить", "Имя"); + Метод0 = ТаблицаМетодов.Найти("Вставить", "Имя"); юТест.ПроверитьНеРавенство(Неопределено, Метод0, "Метод0"); - юТест.ПроверитьРавенство("вставить", Метод0.Имя, "Метод0.Имя"); + юТест.ПроверитьРавенство("Вставить", Метод0.Имя, "Метод0.Имя"); юТест.ПроверитьРавенство(2, Метод0.КоличествоПараметров, "Метод0.КоличествоПараметров"); юТест.ПроверитьРавенство(Ложь, Метод0.ЭтоФункция, "Метод0.ЭтоФункция"); - Метод4 = ТаблицаМетодов.Найти("удалить", "Имя"); + Метод4 = ТаблицаМетодов.Найти("Удалить", "Имя"); юТест.ПроверитьНеРавенство(Неопределено, Метод4, "Метод4"); - юТест.ПроверитьРавенство("удалить", Метод4.Имя, "Метод4.Имя"); + юТест.ПроверитьРавенство("Удалить", Метод4.Имя, "Метод4.Имя"); юТест.ПроверитьРавенство(1, Метод4.КоличествоПараметров, "Метод4.КоличествоПараметров"); юТест.ПроверитьРавенство(Ложь, Метод4.ЭтоФункция, "Метод4.ЭтоФункция"); @@ -185,15 +188,15 @@ юТест.ПроверитьРавенство(Строка(ТипЗнч(ТаблицаМетодов)), "ТаблицаЗначений", "ТаблицаМетодов"); юТест.ПроверитьРавенство(4, ТаблицаМетодов.Количество(), "ТаблицаМетодов.Количество()"); - Метод0 = ТаблицаМетодов.Найти("вызватьметод", "Имя"); + Метод0 = ТаблицаМетодов.Найти("ВызватьМетод", "Имя"); юТест.ПроверитьНеРавенство(Неопределено, Метод0, "Метод0"); - юТест.ПроверитьРавенство("вызватьметод", Метод0.Имя, "Метод0.Имя"); + юТест.ПроверитьРавенство("ВызватьМетод", Метод0.Имя, "Метод0.Имя"); юТест.ПроверитьРавенство(3, Метод0.КоличествоПараметров, "Метод0.КоличествоПараметров"); юТест.ПроверитьРавенство(Истина, Метод0.ЭтоФункция, "Метод0.ЭтоФункция"); - Метод2 = ТаблицаМетодов.Найти("получитьтаблицуметодов", "Имя"); + Метод2 = ТаблицаМетодов.Найти("ПолучитьТаблицуМетодов", "Имя"); юТест.ПроверитьНеРавенство(Неопределено, Метод2, "Метод2"); - юТест.ПроверитьРавенство("получитьтаблицуметодов", Метод2.Имя, "Метод2.Имя"); + юТест.ПроверитьРавенство("ПолучитьТаблицуМетодов", Метод2.Имя, "Метод2.Имя"); юТест.ПроверитьРавенство(1, Метод2.КоличествоПараметров, "Метод2.КоличествоПараметров"); юТест.ПроверитьРавенство(Истина, Метод2.ЭтоФункция, "Метод2.ЭтоФункция"); @@ -350,3 +353,30 @@ КонецФункции +Процедура ТестДолжен_ПроверитьМетодСуществуетДляТипа() Экспорт + + Рефлектор = Новый Рефлектор; + ЕстьМетод = Рефлектор.МетодСуществует(Тип("HTTPОтвет"), "ПолучитьТелоКакСтроку"); + юТест.ПроверитьИстину(ЕстьМетод); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПолучитьТаблицуМетодовДляТипа() Экспорт + + Рефлектор = Новый Рефлектор; + Таблица = Рефлектор.ПолучитьТаблицуМетодов(Тип("ДвоичныеДанные")); + юТест.ПроверитьРавенство(3, Таблица.Количество(), "Проверка числа методов"); + + юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("Размер")); + юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("Записать")); + юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("ОткрытьПотокДляЧтения")); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляТипа() Экспорт + Рефлектор = Новый Рефлектор; + Таблица = Рефлектор.ПолучитьТаблицуСвойств(Тип("Файл")); + юТест.ПроверитьНеРавенство(0, Таблица.Количество()); + юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("ПолноеИмя")); + юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("ИмяБезРасширения")); +КонецПроцедуры diff --git a/tests/text-read.os b/tests/text-read.os index 1d5d7b168..5b3daf3f7 100644 --- a/tests/text-read.os +++ b/tests/text-read.os @@ -14,6 +14,8 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтениеСНеобычнымРазделителем3"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтениеПоУмолчаниюПриРазныхРазделителях"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСовместимостьПоведения"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьНаличиеПараметраМонопольно"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботоспособностьПараметраМонопольно"); Возврат ВсеТесты; @@ -224,3 +226,118 @@ ЗаписатьСтрокуТекстаИСравнитьПострочно(Символы.ВК + Символы.ПС, "1", "2", "3"); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьНаличиеПараметраМонопольно() Экспорт + + ИмяТестовогоФайла = "testdata/ObjectModule.txt"; + + Ч = Новый ЧтениеТекста(ИмяТестовогоФайла, КодировкаТекста.UTF8NoBOM, + Символы.ПС, + Символы.ПС, + Истина // Проверяем, что отрабатывает новый параметр конструктора + ); + + Ч.Закрыть(); + + Ч = Новый ЧтениеТекста; + Ч.Открыть(ИмяТестовогоФайла, КодировкаТекста.UTF8NoBOM, + Символы.ПС, + Символы.ПС, + Истина // Проверяем, что отрабатывает новый параметр конструктора + ); + + Ч.Закрыть(); + +КонецПроцедуры + +Функция УдалосьОткрытьИПрочитать(Знач Чтение, Знач ИмяФайла, Знач Монопольно) + + Если Чтение = Неопределено Тогда + + Попытка + + Если Монопольно = Неопределено Тогда + + // Проверяем конструктор с параметром по-умолчанию + Чтение = Новый ЧтениеТекста(ИмяФайла); + + Иначе + + // Явно передаём значение в конструктор + Чтение = Новый ЧтениеТекста(ИмяФайла, , , , Монопольно); + + КонецЕсли; + + Чтение.Закрыть(); + Возврат Истина; + + Исключение + + Возврат Ложь; + + КонецПопытки; + + КонецЕсли; + + Попытка + + Если Монопольно = Неопределено Тогда + + // Поведение с параметром по-умолчанию + Чтение.Открыть(ИмяФайла); + + Иначе + + // Поведение с яыно заданным параметром + Чтение.Открыть(ИмяФайла,,,, Монопольно); + + КонецЕсли; + + Чтение.Закрыть(); + Возврат Истина; + + Исключение + + Возврат Ложь; + + КонецПопытки; + +КонецФункции + +Процедура ТестДолжен_ПроверитьРаботоспособностьПараметраМонопольно() Экспорт + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + Запись = Новый ЗаписьТекста(ИмяВременногоФайла); + + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(, ИмяВременногоФайла, Ложь), + "Немонопольное чтение через конструктор"); + юТест.ПроверитьЛожь(УдалосьОткрытьИПрочитать(, ИмяВременногоФайла, Истина), + "Монопольное чтение через конструктор"); + юТест.ПроверитьЛожь(УдалосьОткрытьИПрочитать(, ИмяВременногоФайла, Неопределено), + "Поведение по-умолчанию через конструктор"); + + + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(Новый ЧтениеТекста, ИмяВременногоФайла, Ложь), + "Немонопольное чтение через Открыть"); + юТест.ПроверитьЛожь(УдалосьОткрытьИПрочитать(Новый ЧтениеТекста, ИмяВременногоФайла, Истина), + "Монопольное чтение через Открыть"); + юТест.ПроверитьЛожь(УдалосьОткрытьИПрочитать(Новый ЧтениеТекста, ИмяВременногоФайла, Неопределено), + "Поведение по-умолчанию через Открыть"); + + Запись.Закрыть(); + + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(, ИмяВременногоФайла, Ложь), + "Немонопольное чтение через конструктор после закрытия записи"); + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(, ИмяВременногоФайла, Истина), + "Монопольное чтение через конструктор после закрытия записи"); + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(, ИмяВременногоФайла, Неопределено), + "Поведение по-умолчанию через конструктор после закрытия записи"); + + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(Новый ЧтениеТекста, ИмяВременногоФайла, Ложь), + "Немонопольное чтение через Открыть после закрытия записи"); + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(Новый ЧтениеТекста, ИмяВременногоФайла, Истина), + "Монопольное чтение через Открыть после закрытия записи"); + юТест.ПроверитьИстину(УдалосьОткрытьИПрочитать(Новый ЧтениеТекста, ИмяВременногоФайла, Неопределено), + "Поведение по-умолчанию через Открыть после закрытия записи"); + +КонецПроцедуры