Тест автоматической подсветки кода, для разных тем.
Код:
;. ________ _____ _________ _________ ;. ___ __/_____________ /_ __ ____/___________ /____ ;. __ / _ _ \_ ___/ __/ _ / _ __ \ __ /_ _ \ ;. _ / / __/(__ )/ /_ / /___ / /_/ / /_/ / / __/ ;. /_/ \___//____/ \__/ \____/ \____/\__,_/ \___/ ; © Webarion ; Version 0.1a EnableExplicit DeclareModule Settings EnableExplicit XIncludeFile "Internal"+#PS$+"Config.pb" ; подключение конфигурации Macro Change_MapElement_Settings(MyMap, MapElement) FindMapElement( MyMap, PeekS( PeekI( MapElement - SizeOf(Integer) ) ) ) EndMacro ;- ОБЪЯВЛЕНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ Enumeration REGEXP #REGEX_Get_Comment_Or_Space #REGEX_Split_Link_Line #REGEX_Get_Link #REGEX_Name_Section_Line #REGEX_Item_Line #REGEX_Parameter EndEnumeration ;- ОБЪЯВЛЕНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ПРОЦЕДУР ; Container Declare Set_Container( Container$ ) Declare.a Examine_Containers() Declare Next_Container() Declare.s Get_Current_Container_Name() ; Section Declare Set_Section( Container$, Section$, Comment$ = "", CommentPos.a = 1 ) Declare.a Examine_Sections( Container$ ) Declare Next_Section() Declare.s Get_Current_Section_Name() ; Item Declare Examine_Items( Container$, Section$ ) Declare Next_Item() Declare.s Get_Current_Item_Name() Declare.s Get_Current_Item_Value() Declare.a Set_Item_String( Container$, Section$, Item$, Value$, Comment$ = "", CommentPos.a = 1 ) Declare.s Get_Item_String( Container$, Section$, Item$, Default_Value$ = "" ) Declare.s Get_Item_Template_String( Container$, Section$, Item$, Default_Value$ = "" ) Declare Set_Item_Integer( Container$, Section$, Item$, Value, Comment$ = "", CommentPos.a = 1 ) Declare Get_Item_Integer( Container$, Section$, Item$, Default_Value = 0 ) ; Param Declare Examine_Params( Container$, Section$, Item$ ) Declare Next_Param() Declare.s Get_Current_Param_Name() Declare.s Get_Current_Param_Value() Declare Set_Param_String( Container$, Section$, Item$, Param$, Value$ ) Declare.s Get_Param_String( Container$, Section$, Item$, Param$, Default_Value$ = "" ) Declare Set_Param_Integer( Container$, Section$, Item$, Param$, Value ) Declare Get_Param_Integer( Container$, Section$, Item$, Param$, Default_Value = 0 ) Declare Set_Parameters_String( Container$, Section$, Item$, Param1.s, Value1.s, Param2.s = "", Value2.s = "", Param3.s = "", Value3.s = "", Param4.s = "", Value4.s = "", Param5.s = "", Value5.s = "", Param6.s = "", Value6.s = "", Param7.s = "", Value7.s = "", Param8.s = "", Value8.s = "", Param9.s = "", Value9.s = "", Param10.s = "", Value10.s = "", Param11.s = "", Value11.s = "", Param12.s = "", Value12.s = "", Param13.s = "", Value13.s = "", Param14.s = "", Value14.s = "", Param15.s = "", Value15.s = "", Param16.s = "", Value16.s = "", Param17.s = "", Value17.s = "", Param18.s = "", Value18.s = "", Param19.s = "", Value19.s = "", Param20.s = "", Value20.s = "", Param21.s = "", Value21.s = "", Param22.s = "", Value22.s = "", Param23.s = "", Value23.s = "", Param24.s = "", Value24.s = "", Param25.s = "", Value25.s = "", Param26.s = "", Value26.s = "", Param27.s = "", Value27.s = "", Param28.s = "", Value28.s = "", Param29.s = "", Value29.s = "", Param30.s = "", Value30.s = "" ) ; Other Declare Load_File( FilePath$, Container$ = "", Flags_File = #PB_UTF8 ) Declare Save_File( FilePath$, Container$ = "", Flags_File = #PB_UTF8 ) Declare Free_RegEx() ; ОБЪЯВЛЕНИЕ АРХИТЕКТУРЫ ; на данный момент, используется единственная архитектура по умолчанию ; #SETTINGS_ARCHITECTURE = #Architecture_Default XIncludeFile "Internal"+#PS$+"Architectures"+#PS$+"Default_Architecture"+#PS$+"Default_Architecture_Declares.pb" ;- ОБЪЯВЛЕНИЕ РАСШИРЕНИЙ ;- - COMMENTS ; расширение, позволяющее создавать комментарии CompilerIf #EXTENSION_COMMENTS XIncludeFile "Internal"+#PS$+"Extensions"+#PS$+"Comments"+#PS$+"Comments_Declares.pb" CompilerEndIf ;- - TREE ; расширение, позволяющее читать и сохранять древовидную конфигурацию ; Пример .:Item1 = Value1 ; : Item2 = Value2 ; : Item3 = Value3 CompilerIf #EXTENSION_TREE XIncludeFile "Internal"+#PS$+"Extensions"+#PS$+"Tree"+#PS$+"Tree_Declares.pb" CompilerEndIf EndDeclareModule Module Settings ;- СИСТЕМНЫЕ ПРОЦЕДУРЫ XIncludeFile "Internal"+#PS$+"RegexReplace.pb" ; очищает строку от пробелов Procedure.s _Clear_All_Space_String(Text$) While FindString(Text$, " ") : Text$ = ReplaceString(Text$, " ", "") : Wend ProcedureReturn Text$ EndProcedure ; #СИСТЕМНАЯ ПРОЦЕДУРА# ============================================================================================================ ; Описание ...: Ищет в тексте неэкранированную строку ; Параметры ..: Text$ - Текст, в котором происходит поиск ; : Search_Text$ - Строка поиска ; : Escape_Text$ - Экранирующий текст ; Возвращает .: Позицию строки от начала (первый символ = 1), если строка найдена и не экранирована ; : #False - Если строка не найдена, либо данная строка экранирована ; ================================================================================================================================== Procedure _Find_Text_Not_Escape( Text$, Search_Text$, Escape_Text$ ) Protected Find_Text = FindString( Text$, Search_Text$, 1 ) Protected Find_Escape = FindString( Text$, Escape_Text$, Find_Text - Len(Escape_Text$) ) If Not Find_Escape And Find_Text ProcedureReturn Find_Text EndIf ProcedureReturn #False EndProcedure ; создаёт регулярные выражения, если их нет Procedure _Create_RegEx() ; определяет, является ли строка комментарием либо пустой строкой If Not IsRegularExpression( #REGEX_Get_Comment_Or_Space ) CreateRegularExpression( #REGEX_Get_Comment_Or_Space, "^\s*;|^\s*$" ) EndIf ; определение ссылок шаблонизатора в строке If Not IsRegularExpression( #REGEX_Get_Link ) CreateRegularExpression( #REGEX_Get_Link, "(?<!\\)\{\s*(.+?)\s*\}" ) ; с двоеточием: "(?<!\\)\{\s*(.+?)\s*(?::(.+?))?\s*\}" EndIf ; получение вложенностей базы относительно ссылки шаблонизатора If Not IsRegularExpression( #REGEX_Split_Link_Line) CreateRegularExpression( #REGEX_Split_Link_Line, "\s*((?:[^\\/]|\\\/)+)" ) EndIf ; определение имени секции If Not IsRegularExpression( #REGEX_Name_Section_Line ) CreateRegularExpression( #REGEX_Name_Section_Line, "^\s*\[(.*)\]" ) EndIf ; определение элемента If Not IsRegularExpression( #REGEX_Item_Line ) CreateRegularExpression( #REGEX_Item_Line, "^(\s*)(.+?)\s*(:|=)\s*(.+?)\s*$" ) ;"^(\s*)(?:([^:]+?)\s*(?<!\\)=\s*(.*?)\s*|([^=]+?)\s*(?<!\\):\s*(.*)\s*)$" ) EndIf If Not IsRegularExpression( #REGEX_Parameter ) CreateRegularExpression( #REGEX_Parameter, "\s*(.*?)\s*(?:(?<!\\)=\s*(.*?))?\s*(?:[^\\]\||\z)" ) EndIf EndProcedure _Create_RegEx() ;- ПОДКЛЮЧЕНИЕ ПРОЦЕДУР АРХИТЕКТУРЫ ; на данный момент включает единственную архитектуру по умолчанию XIncludeFile "Internal"+#PS$+"Architectures"+#PS$+"Default_Architecture"+#PS$+"Default_Architecture_Procedures.pb" ;- --- LINKS ; разделяет ссылку шаблонизатора на уровни иерархии Procedure _Split_Link( Line$, List lList$() ) If IsRegularExpression( #REGEX_Split_Link_Line ) ClearList( lList$() ) If ExamineRegularExpression( #REGEX_Split_Link_Line, Line$ ) While NextRegularExpressionMatch( #REGEX_Split_Link_Line ) AddElement( lList$() ) lList$() = Trim( RegularExpressionGroup( #REGEX_Split_Link_Line, 1) ) Wend EndIf EndIf EndProcedure ; #СИСТЕМНАЯ ПРОЦЕДУРА# ============================================================================================================ ; Описание ...: Процедура линкера. Заменяет ссылку на данные, расположенные по этой ссылке ; ================================================================================================================================== Global NewMap g_History_Link$() ; декларация внутренней процедуры линкера. Declare.s _Get_Link_String( Link$, Default_Value$ = "", Container$ = "" ) Procedure.s _Replace_Link( Line$, Container$ = "" ) ; ищем ссылки линкера If IsRegularExpression( #REGEX_Get_Link ) And ExamineRegularExpression( #REGEX_Get_Link, Line$ ) While NextRegularExpressionMatch( #REGEX_Get_Link ) Define Find_Text$ = Trim( RegularExpressionMatchString( #REGEX_Get_Link ) ) Define Link$ = RegularExpressionGroup( #REGEX_Get_Link, 1 ) Define NoSpace_Find$ = LCase( _Clear_All_Space_String(Find_Text$) ) ; удаляем все пробелы из строки If Link$ Define Find_History = FindMapElement( g_History_Link$(), NoSpace_Find$ ) ; узнаём записана ли ссылка в истории AddMapElement( g_History_Link$(), NoSpace_Find$ ) If Find_History ; если ссылка найдена в истории, значит она циклическая, сбрасываем историю и выходим без преобразования ссылки ClearMap( g_History_Link$() ) ProcedureReturn Line$ EndIf Define Replace$ = _Get_Link_String( Link$, "", Container$ ) ; TODO DEFAULT Line$ = ReplaceString(Line$, Find_Text$, Replace$, #PB_String_NoCase) EndIf Wend EndIf ProcedureReturn Line$ EndProcedure Procedure.s _Get_Replace_Link_Item_String( Container$, Section$, Item$, Default_Value$ = "" ) Default_Value$ = _Get_Item_String( Container$, Section$, Item$, Default_Value$ ) ProcedureReturn _Replace_Link( Default_Value$, Container$ ) EndProcedure Procedure.s _Get_Replace_Link_Param_String( Container$, Section$, Item$, Param$, Default_Value$ = "" ) Default_Value$ = _Get_Param_String( Container$, Section$, Item$, Param$, Default_Value$ ) ProcedureReturn _Replace_Link( Default_Value$, Container$ ) EndProcedure Procedure.s _Get_Link_String( Link$, Default_Value$ = "", Container$ = "" ) Protected NewList Hierarchy$(), Section$, Item$, Param$ _Split_Link( Link$, Hierarchy$() ) FirstElement( Hierarchy$() ) Select ListSize( Hierarchy$() ) Case 1 ; поиск в ""/Item - когда Section пустой ProcedureReturn _Get_Replace_Link_Item_String( Container$, "", Hierarchy$(), Default_Value$ ) Case 2 ; поиск в Section/Item Section$ = Hierarchy$() NextElement( Hierarchy$() ) Item$ = Hierarchy$() ProcedureReturn _Get_Replace_Link_Item_String( Container$, Section$, Item$, Default_Value$ ) Case 3 ; поиск в Section/Item/Param Section$ = Hierarchy$() NextElement( Hierarchy$() ) Item$ = Hierarchy$() NextElement( Hierarchy$() ) Param$ = Hierarchy$() ProcedureReturn _Get_Replace_Link_Param_String( Container$, Section$, Item$, Param$, Default_Value$ ) EndSelect ProcedureReturn Default_Value$ EndProcedure ;- ПОДКЛЮЧЕНИЕ ПРОЦЕДУР РАСШИРЕНИЙ CompilerIf #EXTENSION_COMMENTS XIncludeFile "Internal"+#PS$+"Extensions"+#PS$+"Comments"+#PS$+"Comments_Procedures.pb" CompilerEndIf CompilerIf #EXTENSION_TREE XIncludeFile "Internal"+#PS$+"Extensions"+#PS$+"Tree"+#PS$+"Tree_Procedures.pb" CompilerEndIf ;- ПОДКЛЮЧЕНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ПРОЦЕДУР XIncludeFile "User_Procedures"+#PS$+"3_Containers.pb" XIncludeFile "User_Procedures"+#PS$+"4_Sections.pb" XIncludeFile "User_Procedures"+#PS$+"5_Items.pb" XIncludeFile "User_Procedures"+#PS$+"6_Params.pb" XIncludeFile "User_Procedures"+#PS$+"7_Load_Save.pb" XIncludeFile "User_Procedures"+#PS$+"8_RegEx.pb" ; #ПОЛЬЗОВАТЕЛЬСКАЯ ПРОЦЕДУРА# ============================================================================================================ ; Описание ...: Получает данные, по иерархической ссылке ; Параметры ..: Link$ - Иерархическая ссылка к данным. Например: Elements/Начало/Default ; : Container$ [ По умолчанию = "" ] - контейнер, внутри которого будут извлечены данные ; Возвращает .: данные из базы данных, соответствующие иерархической ссылке ; Пример .....: Get_Link_String( "SectionName/ItemName/ParamName", "ContainerName" ) ; ========================================================================================================================================= Procedure.s Get_Link_String( Link$, Default_Value$ = "", Container$ = "" ) ClearMap( g_History_Link$() ) ; сбрасываем предохранитель от циклических ссылок ProcedureReturn _Get_Link_String( Link$, Default_Value$, Container$ ) EndProcedure EndModule ; Математика прямоугольников Procedure.l _Min( a.l, b.l ) If( a < b ) : ProcedureReturn a : EndIf ProcedureReturn b EndProcedure Procedure.l _Max( a.l, b.l ) If( a < b ) : ProcedureReturn b : EndIf ProcedureReturn a EndProcedure ; проверяет, пересекаются ли структуры прямоугольников Procedure.a _Is_Intersection_StrRectangles( *R1.DefRect, *R2.DefRect ) If ( *R1\x + *R1\w > *R2\x ) And ( *R2\x + *R2\w > *R1\x ) And ( *R1\y + *R1\h > *R2\y ) And ( *R2\y + *R2\h > *R1\y ) ProcedureReturn #True EndIf ProcedureReturn #False EndProcedure ; получает пересечение двух указанных структур прямоугольников и записывает его по адресу указанной структуры ; возвращает #True в случае успеха, в противном случае #False Procedure.a _Get_Intersection_StrRectangles( *R1.DefRect, *R2.DefRect, *RetRect.DefRect ) If _Is_Intersection_StrRectangles( *R1, *R2 ) ; если пересекаются Protected Rect.DefRect With Rect \x = _Max( *R1\x, *R2\x ) \w = _Min( *R1\x + *R1\w, *R2\x + *R2\w ) - \x \y = _Max( *R1\y, *R2\y ) \h = _Min( *R1\y + *R1\h, *R2\y + *R2\h ) - \y EndWith CopyStructure( @Rect, *RetRect, DefRect) ProcedureReturn #True EndIf ProcedureReturn #False EndProcedure ; отвечает, находится ли прямоугольник 1 внутри прямоугольника 2 Procedure.a _Rect1_Inside_Rect2( *R1.DefRect, *R2.DefRect ) If *R1\X >= *R2\X And *R1\X+*R1\W <= *R2\X+*R2\W And *R1\Y >= *R2\Y And *R1\Y+*R1\H <= *R2\Y+*R2\H ProcedureReturn #True EndIf ProcedureReturn #False EndProcedure ; получает четыре отсечения по четырём сторонам, между старым и новым прямоугольниками ; записывает результат в *RetRects ; возвращает соответствующие найденным сторонам флаги ; если прямоугольники не пересекаются, возвращается флаг 16 Procedure.a _Get_Four_Rects_Intersection( *Old.DefRect, *New.DefRect, *RetRects.FourRects ) Protected RetTypes.a = 0 If Not _Is_Intersection_StrRectangles( *Old, *New ) ProcedureReturn 16 EndIf Protected MaxONX.l = _Max( *Old\x, *New\x ) Protected MinONX.l = _Min( *Old\x+*Old\w, *New\x+*New\w ) With *RetRects ; верхний If *New\y < *Old\y \t\x = MaxONX \t\y = *New\y \t\w = MinONX - \t\x \t\h = _Max( *Old\y, *New\y ) - \t\y RetTypes | 1 EndIf ; левый If *New\x < *Old\x \l\x = *New\x \l\y = *New\y \l\w = *Old\x - \l\x \l\h = *New\h RetTypes | 2 EndIf ; правый Protected NewXE.l = *New\x + *New\w Protected OldXE.l = *Old\x + *Old\w If NewXE > OldXE \r\x = OldXE \r\y = *New\y \r\w = NewXE - \r\x \r\h = *New\h RetTypes | 4 EndIf ; нижний Protected NewYE.l = *New\y + *New\h Protected OldYE.l = *Old\y + *Old\h If NewYE > OldYE \b\x = MaxONX \b\y = OldYE \b\w = MinONX - \b\x \b\h = NewYE - \b\y RetTypes | 8 EndIf EndWith ProcedureReturn RetTypes EndProcedure ; ЕЩЁ ПРИМЕРЫ ОФОРМЛЕНИЯ ;. ______ __ ____ __ ;. /\__ _\ /\ \__ /\ _`\ /\ \ ;. \/_/\ \/ __ ____\ \ ,_\ \ \ \/\_\ ___ \_\ \ __ ;. \ \ \ /'__`\ /',__\\ \ \/ \ \ \/_/_ / __`\ /'_` \ /'__`\ ;. \ \ \/\ __//\__, `\\ \ \_ \ \ \L\ \/\ \L\ \/\ \L\ \/\ __/ ;. \ \_\ \____\/\____/ \ \__\ \ \____/\ \____/\ \___,_\ \____\ ;. \/_/\/____/\/___/ \/__/ \/___/ \/___/ \/__,_ /\/____/ ;. ;. _/_/_/_/_/ _/ _/_/_/ _/ ;. _/ _/_/ _/_/_/ _/_/_/_/ _/ _/_/ _/_/_/ _/_/ ;. _/ _/_/_/_/ _/_/ _/ _/ _/ _/ _/ _/ _/_/_/_/ ;. _/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ ;. _/ _/_/_/ _/_/_/ _/_/ _/_/_/ _/_/ _/_/_/ _/_/_/ ;. __ __| | ___| | ;. | _ \ __| __| | _ \ _` | _ \ ;. | __/ \__ \ | | ( | ( | __/ ;. _| \___| ____/ \__| \____| \___/ \__,_| \___|