Не знаю, важно ли, но нижеследующий код неверно идентифицирует ошибку (или мне так кажется, что неверно). Вместо того, чтобы указать, что незакрыта скобка, указывается, что другой тип ожидается.
(*!BEGINCOMMONMODULEOBERON7*)
(* Модуль для работы с кодом Javascript *)
MODULE Js;
IMPORT JS;
TYPE
String* = POINTER TO RECORD END;
PROCEDURE StringFromArrayChar*(arr : ARRAY OF CHAR) : String;
VAR
s : String;
i : INTEGER;
BEGIN
JS.do("s = ''");
JS.do("for(mi=0; i<arr.length; i++) {s = s + JS.String.fromCharCode(arr[i])}");
RETURN s
END StringFromArrayChar;
PROCEDURE ArrayFromString*(s : String; VAR res: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
JS.do("res = RTL$.strToArray(s)");
END ArrayFromString;
PROCEDURE CharCodeAt(s : String; n : INTEGER) : INTEGER;
VAR
res : INTEGER;
BEGIN
JS.do("res = s.charCodeAt(n)");
RETURN res
END CharCodeAt;
(* *)
PROCEDURE Replace*(s, pattern, what: String): String;
VAR
res: String;
BEGIN
JS.do("res = s.replace(pattern, what)");
RETURN res
END Replace;
(* *)
PROCEDURE Search*(s, what: String): INTEGER;
VAR
res: INTEGER;
BEGIN
JS.do("res = s.search(what)");
RETURN res
END Search;
(* *)
PROCEDURE Concat*(s1, s2: String): String;
VAR
res: String;
BEGIN
JS.do("res = s1 + s2");
RETURN res
END Concat;
BEGIN
END Js.
(* Модуль для работы с API снегопата *)
MODULE Snegopat;
IMPORT Js, JS;
TYPE
(* Выделение редактора текста *)
Selection* = POINTER TO SelectionRec;
SelectionRec* = RECORD
beginRow, beginCol, endRow, endCol: INTEGER
END;
(* окно редактора текста *)
TextWindow* = POINTER TO TextWindowRec;
TextWindowRec* = RECORD
text*, selectedText*: Js.String;
hwnd*: INTEGER;
multyEdit*: BOOLEAN;
linesCount*: INTEGER
END;
(* *)
PROCEDURE ScriptFullPath*(): Js.String; (*{*)
VAR
res: Js.String;
BEGIN
JS.do("res = JS.SelfScript.fullPath");
RETURN res
END ScriptFullPath; (*}*)
(* *)
PROCEDURE activeTextWindow*(): TextWindow; (*{*)
VAR wnd: TextWindow;
BEGIN
JS.do("wnd = JS.snegopat.activeTextWindow()");
RETURN wnd
END activeTextWindow; (*}*)
(* *)
PROCEDURE GetSelection*(TextWnd: TextWindow): Selection; (*{*)
VAR
res: Selection;
BEGIN
JS.do("res = TextWnd.getSelection()");
RETURN res
END GetSelection; (*}*)
(* *)
PROCEDURE GetCaretPos*(TextWnd: TextWindow): Selection; (*{*)
VAR
res: Selection;
BEGIN
JS.do("res = TextWnd.getCaretPos()");
RETURN res
END GetCaretPos; (*}*)
(* *)
PROCEDURE SetSelection*(TextWnd: TextWindow; StartLine, StartCol, EndLine, EndCol: INTEGER); (*{*)
BEGIN
JS.do("TextWnd.setSelection(StartLine, StartCol, EndLine, EndCol)")
END SetSelection; (*}*)
(* *)
PROCEDURE SetCaretPos*(TextWnd: TextWindow; Line, Col: INTEGER); (*{*)
BEGIN
JS.do("TextWnd.setCaretPos(Line, Col)")
END SetCaretPos; (*}*)
(* *)
PROCEDURE Line*(TextWnd: TextWindow; ind: INTEGER): Js.String; (*{*)
VAR
res: Js.String;
BEGIN
JS.do("res = TextWnd.line(ind)");
RETURN res
END Line; (*}*)
BEGIN
END Snegopat.
(* Модуль для работы с глобальным контектом конфигуратора 1С *)
MODULE GlobalDesigner;
IMPORT Js, JS;
TYPE
(* Файл *)
File* = POINTER TO FileRec;
FileRec* = RECORD
Name*, BaseName*: ARRAY 256 OF CHAR;
FullName*, Path*: ARRAY 1024 OF CHAR;
Extension*: ARRAY 10 OF CHAR;
Exist*, IsDirectory*, IsFile*: PROCEDURE(): BOOLEAN
END;
(* Текстовый документ *)
TextDocument* = POINTER TO TextDocumentRec;
TextDocumentRec* = RECORD
InsertLine*, ReplaceLine*: PROCEDURE (i: INTEGER; s: Js.String);
Put*: PROCEDURE (textdoc: TextDocument);
AddLine*, SetText*, SetFileType*: PROCEDURE (s: Js.String);
Write*, Read*: PROCEDURE (FileName, FileType, LineSeparator: Js.String);
LineCount*: PROCEDURE(): INTEGER;
Clear*: PROCEDURE;
Show*: PROCEDURE(Title, FileName: Js.String);
GetLine*: PROCEDURE (i: INTEGER): Js.String;
GetText*: PROCEDURE (): Js.String;
DeleteLine*: PROCEDURE (i: INTEGER)
END;
(* Предупреждение *)
PROCEDURE MessageBox*(str: ARRAY OF CHAR); (*{*)
BEGIN
JS.do("JS.Designer.MessageBox(Js.StringFromArrayChar(str))")
END MessageBox; (*}*)
(* Сообщить *)
PROCEDURE Message*(str: ARRAY OF CHAR); (*{*)
BEGIN
JS.do("JS.Designer.Message(Js.StringFromArrayChar(str))")
END Message; (*}*)
(* КОНСТРУКТОРЫ ОБЪЕКТОВ *)
(* Файл *)
PROCEDURE NewFile*(Name: Js.String): File; (*{*)
VAR
obj: File;
BEGIN
JS.do("obj = JS.Designer.v8New('File', Name)");
RETURN obj
END NewFile; (*}*)
(* ТекстовыйДокумент *)
PROCEDURE NewTextDocument(): TextDocument; (*{*)
VAR
obj: TextDocument;
BEGIN
JS.do("obj = JS.Designer.v8New('TextDocument')")
RETURN obj
END NewTextDocument; (*}*)
(* *)
PROCEDURE Find*(Str, SubStr: Js.String): INTEGER; (*{*)
VAR
res: INTEGER;
BEGIN
JS.do("res = JS.Designer.Find(Str, SubStr)");
RETURN res
END Find; (*}*)
BEGIN
END GlobalDesigner.
(*!ENDCOMMONMODULEOBERON7*)
(* Модуль для работы с кодом *)
MODULE Tools;
IMPORT Js, JS, gl:=GlobalDesigner, sn:= Snegopat;
CONST
BEGINMODULEOBERON7 = "BEGINMODULEOBERON7";
ENDMODULEOBERON7 = "ENDMODULEOBERON7";
BEGINCOMMONMODULEOBERON7 = "BEGINCOMMONMODULEOBERON7";
ENDCOMMONMODULEOBERON7 = "ENDCOMMONMODULEOBERON7)";
(* Процедура компилирует текст активного тектового окна *)
PROCEDURE CompileActiveTextWindow*(); (*{*)
VAR
BEGIN
gl.MessageBox("тодо Пока не реализовано");
END CompileActiveTextWindow; (*}*)
(* *)
PROCEDURE ExistCodeOberon(TextWnd: sn.TextWindow; VAR beginRow, endRow: INTEGER; CommModule: BOOLEAN): BOOLEAN; (*{*)
VAR
res: BOOLEAN;
ind, countRow, pos: INTEGER;
str: Js.String;
arr: ARRAY 1024 OF CHAR;
BEGIN
beginRow := 0;
endRow := 0;
countRow := TextWnd.linesCount;
ind := 0;
WHILE ind < countRow DO
INC(ind);
str := sn.Line(TextWnd, ind);
IF CommModule THEN
IF Js.Search(str, Js.StringFromArrayChar(BEGINCOMMONMODULEOBERON7)) # -1 THEN
beginRow := ind + 1;
ELSIF Js.Search(str, Js.StringFromArrayChar(ENDCOMMONMODULEOBERON7)) # -1 THEN
endRow := ind + 1;
END;
ELSE
(*IF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(BEGINMODULEOBERON7)) # -1 THEN*)
IF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(BEGINMODULEOBERON7)) # -1 THEN
beginRow := ind + 1;
ELSIF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(ENDMODULEOBERON7)) # -1 THEN
endRow := ind + 1;
END;
END;
END;
IF beginRow > 0 THEN
res := TRUE
ELSE
res := FALSE
END;
RETURN res
END ExistCodeOberon; (*}*)
(* *)
PROCEDURE AddCodeOberon(TextWnd: sn.TextWindow; beginRow, endRow: INTEGER; CommModule: BOOLEAN); (*{*)
VAR
res: BOOLEAN;
BEGIN
(* тодо *)
END AddCodeOberon; (*}*)
(* *)
PROCEDURE EditActiveTextWindow*(); (*{*)
VAR
ActiveTextWnd: sn.TextWindow;
FileCommonModuleO7: gl.File;
name: Js.String;
beginRow, endRow: INTEGER;
BEGIN
ActiveTextWnd := sn.activeTextWindow();
IF ActiveTextWnd = NIL THEN
gl.MessageBox("Не выбрано окно модуля")
ELSE
IF ~ExistCodeOberon(ActiveTextWnd, beginRow, endRow, FALSE) THEN
(* добавить код оберона в конец *)
AddCodeOberon(ActiveTextWnd, beginRow, endRow, FALSE);
ELSE
(* отменить комментирование кода оберона, удалить яваскрипт после оберона *)
END;
name := Js.Replace(sn.ScriptFullPath(), Js.StringFromArrayChar("OberonTools.js"), Js.StringFromArrayChar("CommonModules.ob7"));
FileCommonModuleO7:= gl.NewFile(name);
IF FileCommonModuleO7.Exist() THEN
IF ~ExistCodeOberon(ActiveTextWnd, beginRow, endRow, TRUE) THEN
(* тодо добавить код общих модулей *)
END;
END
END;
END EditActiveTextWindow; (*}*)
BEGIN
END Tools.