Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ISBL lexer #891

Merged
merged 28 commits into from
Apr 3, 2020
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
84d9333
Add ISBL lexer
MedvedTMN Apr 3, 2018
ca20cb4
Change theme name
MedvedTMN Apr 4, 2018
be99ad8
Fixed a problem with multi-line strings
MedvedTMN Apr 9, 2018
1472c11
fixed isbl themes
MedvedTMN Apr 10, 2018
0d1adf8
Fixed isbl_editor_dark theme
MedvedTMN Apr 13, 2018
2424f3e
Merge branch 'master' into master
MedvedTMN Aug 1, 2019
a906ddf
Syncing a fork
MedvedTMN Aug 2, 2019
5c261b4
resolve conflicts
MedvedTMN Aug 6, 2019
c16b4a6
Merge branch 'rouge-ruby-master'
MedvedTMN Aug 6, 2019
a1416c4
remove themes
MedvedTMN Aug 6, 2019
ff181ca
correction after code review
MedvedTMN Sep 19, 2019
5726644
Cleanup ISBL lexer submission
ashmaroli Sep 19, 2019
00958e1
Merge pull request #2 from ashmaroli/isbl-lexer-cleanup
MedvedTMN Mar 10, 2020
2b07e0d
remove isbl themes
MedvedTMN Mar 10, 2020
5862b09
Merge branch 'master' into master
MedvedTMN Mar 10, 2020
b04b4ff
fix uppercase class name
MedvedTMN Mar 10, 2020
2d2f0e4
Merge branch 'master' of https://github.com/MedvedTMN/rouge
MedvedTMN Mar 10, 2020
a3900dc
Change visual sample
MedvedTMN Apr 1, 2020
b20e137
Change visual sample
MedvedTMN Apr 1, 2020
93261c4
Delete trailing whitespaces
MedvedTMN Apr 2, 2020
61586ae
Delete trailing whitespaces
MedvedTMN Apr 2, 2020
0413964
Merge branch 'master' of https://github.com/MedvedTMN/rouge
MedvedTMN Apr 2, 2020
95f7c3f
Revert "Delete trailing whitespaces"
MedvedTMN Apr 2, 2020
0fe5099
Delete trailing whitespaces
MedvedTMN Apr 2, 2020
fd52e0e
Shortened visual sample
MedvedTMN Apr 2, 2020
7cfb39e
Add targeted examples to visual sample
pyrmont Apr 2, 2020
3741e0d
Convert file format to UNIX
pyrmont Apr 2, 2020
e8da3f7
Update visual sample
MedvedTMN Apr 2, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/rouge/demos/isbl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
NameReq = Object.Requisites(SYSREQ_NAME)
if Assigned(NameReq.AsString)
ShowMessage("Привет мир")
endif
97 changes: 97 additions & 0 deletions lib/rouge/lexers/isbl.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# -*- coding: utf-8 -*- #
# frozen_string_literal: true

module Rouge
module Lexers
class ISBL < RegexLexer
title "ISBL"
desc "The ISBL programming language"
tag 'isbl'
filenames '*.isbl'

def self.builtins
load File.join(__dir__, 'isbl/builtins.rb')
self.builtins
end

def self.constants
@constants ||= self.builtins["const"].merge(self.builtins["enum"]).collect!(&:downcase)
end

def self.interfaces
@interfaces ||= self.builtins["interface"].collect!(&:downcase)
end

def self.globals
@globals ||= self.builtins["global"].collect!(&:downcase)
end

def self.keywords
@keywords = Set.new %w(
and и else иначе endexcept endfinally endforeach конецвсе endif конецесли endwhile
конецпока except exitfor finally foreach все if если in в not не or или try while пока
)
end

state :whitespace do
rule %r/\s+/m, Text
rule %r(//.*?$), Comment::Single
rule %r(/[*].*?[*]/)m, Comment::Multiline
end

state :dotted do
mixin :whitespace
rule %r/[a-zа-яё_0-9]*/i do |m|
name = m[0]
if self.class.constants.include? name.downcase
token Name::Builtin
elsif in_state? :type
token Keyword::Type
else
token Name
end
pop!
end
end

state :type do
mixin :whitespace
rule %r/[a-zа-яё_0-9]*/i do |m|
name = m[0]
if self.class.interfaces.include? name.downcase
token Keyword::Type
else
token Name
end
pop!
end
rule %r/[.]/, Punctuation, :dotted
rule(//) { pop! }
end

state :root do
mixin :whitespace
rule %r/[:]/, Punctuation, :type
rule %r/[.]/, Punctuation, :dotted
rule %r/[\[\]();]/, Punctuation
rule %r([&*+=<>/-]), Operator
rule %r/\b[a-zа-яё_][a-zа-яё_0-9]*(?=[(])/i, Name::Function
rule %r/[a-zа-яё_!][a-zа-яё_0-9]*/i do |m|
name = m[0]
if self.class.keywords.include? name.downcase
token Keyword
elsif self.class.constants.include? name.downcase
token Name::Builtin
elsif self.class.globals.include? name.downcase
token Name::Variable::Global
else
token Name::Variable
end
end
rule %r/\b(\d+(\.\d+)?)\b/, Literal::Number
rule %r(["].*?["])m, Literal::String::Double
rule %r(['].*?['])m, Literal::String::Single
end
end
end
end
17 changes: 17 additions & 0 deletions lib/rouge/lexers/isbl/builtins.rb

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions spec/lexers/isbl_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# -*- coding: utf-8 -*- #

describe Rouge::Lexers::ISBL do
let(:subject) { Rouge::Lexers::ISBL.new }

describe 'guessing' do
include Support::Guessing

it 'guesses by filename' do
assert_guess :filename => 'foo.isbl'
end
end
end
257 changes: 257 additions & 0 deletions spec/visual/samples/isbl
Original file line number Diff line number Diff line change
@@ -0,0 +1,257 @@
/********************************************
* Получить список кодов или ИД работников, *
* соответствующих пользователю. *
********************************************/

ADD_EQUAL_NUMBER_TEMPLATE = "%s.%s = %s"
ADD_EQUAL_STATE_TEMPLATE = "%s.%s = '%s'"
EMPLOYEES_REFERENCE = "РАБ"
// Проверить, сущуствует ли пользователь с ИД UserID
ExceptionsOff()
FreeException()
ServiceFactory.GetUserByID(UserID)
ExceptionsOn()
if ExceptionExists()
Raise(CreateException("EDIRInvalidTypeOfParam";
LoadStringFmt("DIR21A2F148_1B41_40F3_9152_6E09E712025A"; "COMMON";
ArrayOf(UserID)); ecException)) // Не существует пользователя с ИД = %s
endif
Employees = CreateReference(EMPLOYEES_REFERENCE; ArrayOf("Пользователь"; SYSREQ_STATE); FALSE)
Employees.Events.DisableAll
EmployeesTableName = Employees.TableName
EmployeesUserWhereID = Employees.AddWhere(Format(ADD_EQUAL_NUMBER_TEMPLATE; ArrayOf(EmployeesTableName;
Employees.Requisites("Пользователь").SQLFieldName; UserID)))
if OnlyActive
EmployeesStateWhereID = Employees.AddWhere(Format(ADD_EQUAL_STATE_TEMPLATE; ArrayOf(EmployeesTableName;
Employees.Requisites(SYSREQ_STATE).SQLFieldName; Employees.Requisites(SYSREQ_STATE).Items.IDByValue("Действующая"))))
endif
if Assigned(OurOrgID)
EmployeesOurOrgIDWhereID = Employees.AddWhere(Format(ADD_EQUAL_STATE_TEMPLATE; ArrayOf(EmployeesTableName;
Employees.Requisites("НашаОрг").SQLFieldName; OurOrgID)))
endif
Employees.Open()
Result = CreateStringList()
foreach Employee in Employees
if IsResultCode
Result.Add(Employee.SYSREQ_CODE)
else
Result.Add(Employee.SYSREQ_ID)
endif
endforeach
Employees.Close()
Employees.DelWhere(EmployeesUserWhereID)
if OnlyActive
Employees.DelWhere(EmployeesStateWhereID)
endif
if Assigned(OurOrgID)
Employees.DelWhere(EmployeesOurOrgIDWhereID)
endif
Employees.Events.EnableAll

/**********************************************
* Подсчитать количество страниц в PDF-файле. *
**********************************************/

try
try
// Подключиться к библиотеке
PDFDocument = CreateObject('DebenuPDFLibraryLite.PDFLibrary')
except
Raise(CreateException('EDIRLibObjectNotFound';
LoadString('DIRB9A32A61_8B1D_49A2_A4F1_E1C60270757E'; 'COMMON'); ecException))
endexcept
// Загрузить файл. FilePath - путь к PDF-документу
if PDFDocument.LoadFromFile(FilePath; "") = 1
// Получить количество страниц
Result = PDFDocument.PageCount
endif
finally
PDFDocument = nil
endfinally

/*******************************************
* Импортировать сертификаты пользователя. *
*******************************************/

YES_VALUE_STR = 'Да'
NO_VALUE_STR = 'Нет'
CertifatePathList = CreateStringList()
if Assigned(CertArray)
CertifatePathList = AD_ExportCertificatesFromArray(CertArray)
endif
if CertifatePathList.Count > 0
UserReference = References.SYSREF_USERS_REFERENCE.GetObjectByID(UserID)
// Импортировать сертификаты
CertificatesDetailDataSet = UserReference.DetailDataSet(2)
HasDefaultCertificate = CertificatesDetailDataSet.Locate(SYSREQ_USERS_USER_DEFAULT_CERTIFICATE; YES_VALUE_STR)
SignAndEncExist = CertificatesDetailDataSet.Locate('ISBCertificateType'; CERTIFICATE_TYPE_SIGN_AND_ENCRYPT)
// Сформировать список плагинов
Plugins = CreateStringList()
// Plugin Bicrypt
Plugins.Add('{918672C1-2E22-484E-A9A4-4BBEFF197FD0}')
// Plugin CryptoPro
Plugins.Add('{6F21AC62-2750-4DE2-84C9-AD87F1DA4BA1}')
// Plugin Capicom
Plugins.Add('{B1B27433-D685-47F8-8500-CF9525407145}')

foreach CertificateFileName in CertifatePathList
if FileExists(CertificateFileName)
try
// Определить плагин, соответствующий сертификату
foreach PluginName in Plugins
FreeException()
ExceptionsOff()
CertificateID = ReadCertificateFromFile(CertificateFileName; ; cpID; PluginName)
ExceptionsOn()
if not ExceptionExists()
exitfor
endif
endforeach
if Assigned(CertificateID)
CertificateOwner = ReadCertificateFromFile(CertificateFileName; ; cpSubjectName; PluginName)
CertificateFromDate = ReadCertificateFromFile(CertificateFileName; ; cpValidFromDate; PluginName)
CertificateToDate = ReadCertificateFromFile(CertificateFileName; ; cpValidToDate; PluginName)
CertificateCanSign = ReadCertificateFromFile(CertificateFileName; ; cpDigitalSignatureEnabled; PluginName)
CertificateCanEnc = ReadCertificateFromFile(CertificateFileName; ; cpDataEnciphermentEnabled; PluginName)
ExpiredCert = DateDiff('D'; Today(); CertificateToDate) < 0
if (CertificateCanSign or CertificateCanEnc) and not ExpiredCert
// Выполнить проверку на наличие сертификата в хранилище
if not CertificatesDetailDataSet.Locate(SYSREQ_USERS_USER_CERTIFICATE_THUMBPRINT; CertificateID) // Сертификат не найден
try
Events = CertificatesDetailDataSet.Events
Events.AddCheckPoint
Events.Events(dseBeforeInsert).Enabled = FALSE
CertificatesDetailDataSet.Append
Events.ReleaseCheckPoint
CertificatesDetailDataSet.SYSREQ_USERS_USER_CERTIFICATE_SUBJECT_NAME = CertificateOwner
CertificatesDetailDataSet.SYSREQ_USERS_USER_CERTIFICATE_THUMBPRINT = CertificateID
CertificatesDetailDataSet.Requisites(SYSREQ_USERS_USER_CERTIFICATE).LoadFromFile(CertificateFileName)
CertificatesDetailDataSet.SYSREQ_USERS_USER_CERTIFICATE_STATE = OPERATING_RECORD_FLAG_FEMININE
CertificatesDetailDataSet.SYSREQ_USERS_USER_CERTIFICATE_PLUGIN_NAME = PluginName

// Определить тип сертификата
ISBCertificateType = IfThen(CertificateCanSign and CertificateCanEnc; IfThen(SignAndEncExist; CERTIFICATE_TYPE_SIGN; CERTIFICATE_TYPE_SIGN_AND_ENCRYPT);
IfThen(CertificateCanSign; CERTIFICATE_TYPE_SIGN; CERTIFICATE_TYPE_ENCRYPT))
if ISBCertificateType == CERTIFICATE_TYPE_SIGN_AND_ENCRYPT
SignAndEncExist = TRUE
AD_WriteToLog(LoadStringFmt('DIR61B72B83_DEC3_434E_BA18_8E966FB76E05'; 'COMMON'; CertificateID))
endif

CertificatesDetailDataSet.ISBCertificateType = ISBCertificateType
// Установить по умолчанию
if not HasDefaultCertificate and CertificateCanSign
CertificatesDetailDataSet.SYSREQ_USERS_USER_DEFAULT_CERTIFICATE = YES_VALUE_STR
HasDefaultCertificate = TRUE
else
CertificatesDetailDataSet.SYSREQ_USERS_USER_DEFAULT_CERTIFICATE = NO_VALUE_STR
endif
CertificatesDetailDataSet.ISBCertificateInfo = Format('%s %s'; ArrayOf(LoadString('ISB_REQ_Г000063'; 'ISBSYSDEV'); CertificateOwner))
except
CertificatesDetailDataSet.Delete
AD_WriteToLog(GetLastException().Message)
endexcept
else
AD_WriteToLog(LoadStringFmt('DIRCC6D87E5_A4D3_4CD1_96F9_DF96010E1BA7'; 'COMMON'; CertificateID))
endif
else
Text = IfThen(ExpiredCert; LoadStringFmt('DIR9CF98EB3_38B8_422B_9843_1D1D17E1D155'; 'COMMON'; CertificateID);
LoadStringFmt('DIRD0F733DB_9BF8_4104_A0BF_CC8144F8168B'; 'COMMON'; CertificateID))
AD_WriteToLog(Text)
endif
else
AD_WriteToLog(LoadStringFmt('DIRD053139F_6203_4533_A9EC_42C893C2AEAC'; 'COMMON'; UserReference.Дополнение))
endif
finally
DeleteFile(CertificateFileName)
endfinally
endif
endforeach
try
UserReference.Save()
Message = LoadString('DIR6E06F1B4_07C7_4C6D_ADD7_53E09563D708'; 'COMMON')
except
UserReference.Cancel()
Message = LoadString('DIR4B329CD9_6912_4F91_8AE1_366F94FA67C7'; 'COMMON')
AD_WriteToLog(GetLastException().Message)
endexcept
AD_WriteToLog(Message)
else
AD_WriteToLog(LoadString('DIR032410C3_F2AA_4CD0_B72D_4DA87AAFC0BD'; 'COMMON'))
endif

/*****************************
* Склонение ФИО по падежам. *
*****************************/

!ММФиоСклПадеж=""
Если !Фам<<>>"" И !Имя<<>>"" И !Пол<<>>''
// Список согласных букв
!СписСогл='б,в,г,д,ж,з,к,л,м,н,п,р,с,т,ф,ц,ч,ш,щ,ъ'
!СписГлас='а,е,и,о,у,ы,э,ю,я'
!Длина=ДлинаСтр(!Фам)
!Имя=РазбСтр(!Имя;1;1)
!Отч=РазбСтр(!Отч;1;1)

Если !Пол=="Мужской"

!ПоследСимвол=СтрНижнРегистр(ВыделитьСтр(!Фам;!Длина;1))
!НовФам=""

// Фамилия заканчивается на согласную
Если ПоискПодстр(!ПоследСимвол;!СписСогл;',')<>0
!НовФам=!Фам&"у"
КонецЕсли

// Фамилия заканчивается на а/я
Если !ПоследСимвол=='а' ИЛИ !ПоследСимвол=='я'
!НовФам=ВыделитьСтр(!Фам;1;!Длина-1)&"е"
КонецЕсли

// Фамилия заканчивается на ь
Если !ПоследСимвол=='ь'
!НовФам=ВыделитьСтр(!Фам;1;!Длина-1)&"ю"
КонецЕсли

// Фамилия заканчивается на ух,юх,ех,ах,ях
!ПоследСимвол2=ВыделитьСтр(!Фам;!Длина-1;2)
Если !ПоследСимвол=='ух' ИЛИ !ПоследСимвол=='юх' ИЛИ
!ПоследСимвол=='ех' ИЛИ !ПоследСимвол=='ах' ИЛИ
!ПоследСимвол=='ях'
!НовФам=!Фам&"у"
КонецЕсли

// Фамилия заканчивается на ух,юх,ех,ах,ях
Если !ПоследСимвол2=="ой" ИЛИ !ПоследСимвол2=="ий"
!НовФам=ВыделитьСтр(!Фам;1;!Длина-2)&"ому"
Иначе
// Фамилия заканчивается на й
Если !ПоследСимвол=='й'
!НовФам=ВыделитьСтр(!Фам;1;!Длина-1)&"ю"
КонецЕсли
КонецЕсли
Если !НовФам==""
!НовФам = !Фам
КонецЕсли
!НовФам="г-ну "&!НовФам
Иначе // Пол женский
!НовФам=!Фам
!Длина=ДлинаСтр(!Фам)
!ПоследСимвол=ВыделитьСтр(!Фам;!Длина;1)
!ПоследСимвол2=ВыделитьСтр(!Фам;!Длина-1;2)
Если !ПоследСимвол2=="ая"
!НовФам=ВыделитьСтр(!Фам;1;!Длина-2)&"ой"
КонецЕсли
// Фамилия заканчивается на а/я
Если !ПоследСимвол=='а'
!НовФам=ВыделитьСтр(!Фам;1;!Длина-1)&"ой"
КонецЕсли

!НовФам="г-же "&!НовФам
КонецЕсли

Если !Отч<<>>''
!Отч=!Отч&"."
КонецЕсли
!ММФиоСклПадеж=!Должность&" "&СжПроб(!НовФам)&" "&!Имя&". "&!Отч
КонецЕсли