keyboard =
(
<keymap>
<global>
<keyboard>
<q mod="ctrl,shift">Window(1)</q>
<r mod="ctrl,shift">Window(2)</r>
<a mod="ctrl,shift,alt">Window(3)</a>
<a mod="alt">Window(4)</a>
<a mod="shift">Window(5)</a>
<a mod="ctrl">Window(6)</a>
<a mod="shift,alt">Window(7)</a>
<a mod="ctrl,shift">Window(8)</a>
</global>
<Home>
<keyboard>
<q mod="ctrl,shift">Window(12)</q>
<r mod="ctrl,shift">Window(22)</r>
<a mod="ctrl,shift,alt">Window(32)</a>
<a mod="alt">Window(42)</a>
<a mod="shift">Window(52)</a>
<a mod="ctrl">Window(62)</a>
<a mod="shift,alt">Window(72)</a>
<a mod="ctrl,shift">Window(82)</a>
</keyboard>
</Home>
)
MyKey := "a"
Action := "такой"
Section := "global"
Replace = <%MyKey% mod="%ModPref%">%Action%</%MyKey%>
Pos := GetSection(keyboard, Section, Content) ; ищем секцию
if(Pos)
{
;TagPos := GetTagLines(Content, MyKey, TagText, "[ctrl,shif ]{10,}") ; с модификаторами ctrl+shift, не точное решение
TagPos := GetTagLines(Content, MyKey, TagText) ; с любыми модификаторами
if(TagPos[1]) ; если нашли
{
msgbox % ReplaceTagContent(keyboard, Pos+TagPos[3]-2, StrLen(TagText[3]), Action) ; замена действия
msgbox % DeleteTag(keyboard, Pos+TagPos[1]-2, StrLen(TagText[1])) ; удаление тега
}
else
MsgBox подходящих тегов нет
}
else
MsgBox Секция "%Section%" не найдена
ExitApp
; нахождение секции по её имени
; Text- текст, в котором надо искать
; SectionName- имя секции, входной параметр
; Content- содержимое секции, выходной параметр
; возвращает позицию первого символа из шаблона
GetSection(Text, SectionName, ByRef Content)
{
return RegExMatch(Text, "<" SectionName ">\s+<keyboard>.*?</" SectionName ">", Content, 1)
}
; нахождение тега по его имени
; Text- текст, в котором надо искать
; TagName- имя тега, входной параметр
; Content- содержимое секции, выходной параметр
; Content[1]- тег плюс табуляции и пробелы до него и табуляции, пробелы и один перевод строки после
; Content[2]- модификаторы
; Content[3]- содержимое тега
; возвращает позицию первого символа из шаблона
; modTemplate- шаблон, которому должны соответствовать модификаторы
; возвращает массив с позициями первых символов шаблона и подшаблонов, похож на параметр Content.
GetTagLines(Text, TagName, ByRef Content, modTemplate = ".*?")
{
ret := RegExMatch(Text, "P)[\t ]*<" TagName " mod=""(?P<Templ>" modTemplate ")"">(?P<Cont>.*?)</" TagName ">[\t ]*\R", Result)
Content := [SubStr(Text, ret, Result), SubStr(Text, ResultPosTempl, ResultTempl), SubStr(Text, ResultPosCont, ResultLenCont)]
return [ret, ResultPosTempl, ResultPosCont]
}
; замена содержимого тега
; Text- текст, в котором надо заменять
; StartPosition- начало подстроки, которую надо заменить
; Length- длина подстроки, которую надо заменить
; NewContent- строка на которую надо заменить подстроку
ReplaceTagContent(Text, StartPosition, Length, NewContent)
{
return SubStr(Text, 1, StartPosition) . NewContent . SubStr(Text, StartPosition+Length+1)
}
; удаление тега
; Text- текст, в котором надо удалить
; StartPosition- начало подстроки, которую надо удалить
; Length- длина подстроки, которую надо удалить
DeleteTag(Text, StartPosition, Length)
{
return SubStr(Text, 1, StartPosition) . SubStr(Text, StartPosition+Length+1)
}
лучше искать как в примере выше, а то, что нашли дополнительно проверять своей функцией, а не шаблоном.