From 02951cec424f204b6624f266a832d111fdb382df Mon Sep 17 00:00:00 2001 From: Dmitry Titov Date: Sat, 4 Sep 2021 07:20:45 +0700 Subject: [PATCH] Implement 1S:Enterprise (#545) --- README.md | 2 +- lexers/o/onesenterprise.go | 50 +++++++++ lexers/testdata/onesenterprise.actual | 26 +++++ lexers/testdata/onesenterprise.expected | 131 ++++++++++++++++++++++++ styles/onesenterprise.go | 17 +++ 5 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 lexers/o/onesenterprise.go create mode 100644 lexers/testdata/onesenterprise.actual create mode 100644 lexers/testdata/onesenterprise.expected create mode 100644 styles/onesenterprise.go diff --git a/README.md b/README.md index 72bee0b..7786fe1 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ K | Kotlin L | Lighttpd configuration file, LLVM, Lua M | Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL N | NASM, Newspeak, Nginx configuration file, Nim, Nix -O | Objective-C, OCaml, Octave, OpenSCAD, Org Mode +O | Objective-C, OCaml, Octave, OnesEnterprise, OpenSCAD, Org Mode P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, PromQL, Protocol Buffer, Puppet, Python 2, Python Q | QBasic R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust diff --git a/lexers/o/onesenterprise.go b/lexers/o/onesenterprise.go new file mode 100644 index 0000000..cb51b71 --- /dev/null +++ b/lexers/o/onesenterprise.go @@ -0,0 +1,50 @@ +package o + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// 1S:Enterprise lexer. +var OnesEnterprise = internal.Register(MustNewLazyLexer( + &Config{ + Name: "OnesEnterprise", + Aliases: []string{"ones", "onesenterprise", "1S", "1S:Enterprise"}, + Filenames: []string{"*.EPF", "*.epf", "*.ERF", "*.erf"}, + MimeTypes: []string{"application/octet-stream"}, + CaseInsensitive: true, + }, + onesRules, +)) + +func onesRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`[^\S\n]+`, Text, nil}, + {`//(.*?)\n`, Comment, nil}, + {`(#область|#region|#конецобласти|#endregion|#если|#if|#иначе|#else|#конецесли|#endif).*`, CommentPreproc, nil}, + {`(&наклиенте|&atclient|&насервере|&atserver|&насерверебезконтекста|&atservernocontext|&наклиентенасерверебезконтекста|&atclientatservernocontext).*`, CommentPreproc, nil}, + {`(>=|<=|<>|\+|-|=|>|<|\*|/|%)`, Operator, nil}, + {`(;|,|\)|\(|\.)`, Punctuation, nil}, + {Words(``, `\b`, `истина`, `true`, `ложь`, `false`, `и`, `and`, `или`, `or`, `не`, `not`), Operator, nil}, + {Words(``, `\b`, `если`, `if`, `тогда`, `then`, `иначе`, `else`, `иначеесли`, `elsif`, `конецесли`, `endif`), Operator, nil}, + {Words(``, `\b`, `для`, `for`, `каждого`, `each`, `из`, `in`, `цикл`, `do`, `пока`, `while`, `конеццикла`, `enddo`, `по`, `to`), Operator, nil}, + {Words(``, `\b`, `прервать`, `break`, `продолжить`, `continue`, `возврат`, `return`, `перейти`, `goto`), Operator, nil}, + {Words(``, `\b`, `процедура`, `procedure`, `конецпроцедуры`, `endprocedure`, `функция`, `function`, `конецфункции`, `endfunction`), Keyword, nil}, + {Words(``, `\b`, `новый`, `new`, `знач`, `val`, `экспорт`, `export`, `перем`, `var`), Keyword, nil}, + {Words(``, `\b`, `попытка`, `try`, `исключение`, `except`, `вызватьисключение`, `raise`, `конецпопытки`, `endtry`), Keyword, nil}, + {Words(``, `\b`, `выполнить`, `execute`, `вычислить`, `eval`), Keyword, nil}, + {`"`, LiteralString, Push("string")}, + {`[_а-яА-Я0-9][а-яА-Я0-9]*`, Name, nil}, + {`[_\w][\w]*`, Name, nil}, + }, + "string": { + {`""`, LiteralString, nil}, + {`"C?`, LiteralString, Pop(1)}, + {`[^"]+`, LiteralString, nil}, + }, + } +} diff --git a/lexers/testdata/onesenterprise.actual b/lexers/testdata/onesenterprise.actual new file mode 100644 index 0000000..ba44842 --- /dev/null +++ b/lexers/testdata/onesenterprise.actual @@ -0,0 +1,26 @@ +#Область СлужебныйПрограммныйИнтерфейс + +&НаСервере +Функция Создать(ИмяФайла) Экспорт + + //Создает новый архив + + Инфо = Новый Файл(ИмяФайла); + Если Инфо.Существует() Тогда + УдалитьФайлы(ИмяФайла); + КонецЕсли; + + Архив = Новый Структура; + Архив.Вставить("Поток", ФайловыеПотоки.ОткрытьДляЗаписи(ИмяФайла)); + Архив.Вставить("Файлы", Новый Массив); + Архив.Вставить("РазмерКаталога", 0); + + Если Архив.РазмерКаталога > 0 Или Архив.Файлы.Количество() <> 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Архив; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/lexers/testdata/onesenterprise.expected b/lexers/testdata/onesenterprise.expected new file mode 100644 index 0000000..aa07c85 --- /dev/null +++ b/lexers/testdata/onesenterprise.expected @@ -0,0 +1,131 @@ +[ + {"type":"CommentPreproc","value":"#Область СлужебныйПрограммныйИнтерфейс"}, + {"type":"Text","value":"\n\n"}, + {"type":"CommentPreproc","value":"\u0026НаСервере"}, + {"type":"Text","value":"\n"}, + {"type":"Keyword","value":"Функция"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Создать"}, + {"type":"Punctuation","value":"("}, + {"type":"Name","value":"ИмяФайла"}, + {"type":"Punctuation","value":")"}, + {"type":"Text","value":" "}, + {"type":"Keyword","value":"Экспорт"}, + {"type":"Text","value":"\n\t\n\t"}, + {"type":"Comment","value":"//Создает новый архив\n"}, + {"type":"Text","value":"\n\t"}, + {"type":"Name","value":"Инфо"}, + {"type":"Text","value":" "}, + {"type":"Operator","value":"="}, + {"type":"Text","value":" "}, + {"type":"Keyword","value":"Новый"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Файл"}, + {"type":"Punctuation","value":"("}, + {"type":"Name","value":"ИмяФайла"}, + {"type":"Punctuation","value":");"}, + {"type":"Text","value":"\n\t"}, + {"type":"Operator","value":"Если"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Инфо"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"Существует"}, + {"type":"Punctuation","value":"()"}, + {"type":"Text","value":" "}, + {"type":"Operator","value":"Тогда"}, + {"type":"Text","value":"\n\t\t"}, + {"type":"Name","value":"УдалитьФайлы"}, + {"type":"Punctuation","value":"("}, + {"type":"Name","value":"ИмяФайла"}, + {"type":"Punctuation","value":");"}, + {"type":"Text","value":"\n\t"}, + {"type":"Operator","value":"КонецЕсли"}, + {"type":"Punctuation","value":";"}, + {"type":"Text","value":"\n\t\n\t"}, + {"type":"Name","value":"Архив"}, + {"type":"Text","value":" "}, + {"type":"Operator","value":"="}, + {"type":"Text","value":" "}, + {"type":"Keyword","value":"Новый"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Структура"}, + {"type":"Punctuation","value":";"}, + {"type":"Text","value":"\n\t"}, + {"type":"Name","value":"Архив"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"Вставить"}, + {"type":"Punctuation","value":"("}, + {"type":"LiteralString","value":"\"Поток\""}, + {"type":"Punctuation","value":","}, + {"type":"Text","value":" "}, + {"type":"Name","value":"ФайловыеПотоки"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"ОткрытьДляЗаписи"}, + {"type":"Punctuation","value":"("}, + {"type":"Name","value":"ИмяФайла"}, + {"type":"Punctuation","value":"));"}, + {"type":"Text","value":"\n\t"}, + {"type":"Name","value":"Архив"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"Вставить"}, + {"type":"Punctuation","value":"("}, + {"type":"LiteralString","value":"\"Файлы\""}, + {"type":"Punctuation","value":","}, + {"type":"Text","value":" "}, + {"type":"Keyword","value":"Новый"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Массив"}, + {"type":"Punctuation","value":");"}, + {"type":"Text","value":"\n\t"}, + {"type":"Name","value":"Архив"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"Вставить"}, + {"type":"Punctuation","value":"("}, + {"type":"LiteralString","value":"\"РазмерКаталога\""}, + {"type":"Punctuation","value":","}, + {"type":"Text","value":" "}, + {"type":"Name","value":"0"}, + {"type":"Punctuation","value":");"}, + {"type":"Text","value":"\n\n\t"}, + {"type":"Operator","value":"Если"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Архив"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"РазмерКаталога"}, + {"type":"Text","value":" "}, + {"type":"Operator","value":"\u003e"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"0"}, + {"type":"Text","value":" "}, + {"type":"Operator","value":"Или"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Архив"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"Файлы"}, + {"type":"Punctuation","value":"."}, + {"type":"Name","value":"Количество"}, + {"type":"Punctuation","value":"()"}, + {"type":"Text","value":" "}, + {"type":"Operator","value":"\u003c\u003e"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"0"}, + {"type":"Text","value":" "}, + {"type":"Operator","value":"Тогда"}, + {"type":"Text","value":"\n\t\t"}, + {"type":"Operator","value":"Возврат"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Неопределено"}, + {"type":"Punctuation","value":";"}, + {"type":"Text","value":"\n\t"}, + {"type":"Operator","value":"КонецЕсли"}, + {"type":"Punctuation","value":";"}, + {"type":"Text","value":"\n\t\n\t"}, + {"type":"Operator","value":"Возврат"}, + {"type":"Text","value":" "}, + {"type":"Name","value":"Архив"}, + {"type":"Punctuation","value":";"}, + {"type":"Text","value":"\n\t\n"}, + {"type":"Keyword","value":"КонецФункции"}, + {"type":"Text","value":"\n\n"}, + {"type":"CommentPreproc","value":"#КонецОбласти"} +] diff --git a/styles/onesenterprise.go b/styles/onesenterprise.go new file mode 100644 index 0000000..9048e38 --- /dev/null +++ b/styles/onesenterprise.go @@ -0,0 +1,17 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// 1S:Designer color palette +var OnesEnterprise = Register(chroma.MustNewStyle("onesenterprise", chroma.StyleEntries{ + chroma.Text: "#000000", + chroma.Comment: "#008000", + chroma.CommentPreproc: "#963200", + chroma.Operator: "#FF0000", + chroma.Keyword: "#FF0000", + chroma.Punctuation: "#FF0000", + chroma.LiteralString: "#000000", + chroma.Name: "#0000FF", +}))