| Замена | - MultiReplace |
MultiReplace
Краткое описание
Компонент предназначен для множественной замены в тексте
Параметры
Методы
События
Свойства
Данные
Пример
Пример транслита с русского языка на английский язык
Add(MainForm,2953706,252,385)
{
Width=505
Height=516
}
Add(TimeCounter,3921649,427,357)
{
Precision=1
link(onStop,2437858:doText,[])
}
Add(Hub,13279769,203,434)
{
link(onEvent1,3921649:doStart,[(230,440)(230,363)])
link(onEvent2,13466306:doMultiReplace,[])
}
Add(Hub,9957346,378,441)
{
link(onEvent1,3921649:doStop,[(406,447)(406,370)])
link(onEvent2,8892279:doText,[])
}
Add(Label,2437858,483,364)
{
Left=90
Top=10
Caption=""
}
Add(StrList,13260997,308,371)
{
FileName="License.txt"
Strings=#47:
==|40: HiAsm 4.04 build 184|47:
==|24: Лицензионное соглашение|092: Программа HiAsm (в дальнейшем "Программный продукт") создан Dilma (в дальнейшем "Автор").|90: Настоящим лицензионным соглашением удостоверяются права на "Программный продукт" Dilma.|111: "Программный продукт" "Автора" предназначен для конструирования программ без знаний языков программирования.|413: Программа распространяется по принципу "AS IS", что значит, что при правильном или неправильном использование программы "Автор" ответственности не несет. Вы устанавливаете программу под свою ответственность. За ВСЕ сбои после установки программы "Автор" ответственности не несет. Вы устанавливаете программу на свой страх и риск, хотя "Автором" было сделано все возможное, чтобы ошибок, сбоев, поломок не было.|103: Программа распространяется по принципу "Freeware", что означает, что программа абсолютно бесплатная.|107: По всем вопросам и предложениям связанным с программой, а также недоработках, просьба сообщать "Автору".|2: |55: Домашняя страница в Интернете: http://www.hiasm.com|56: Электронная почта проекта (E-Mail): hiasm@hiasm.com|039: "Автор": Dilma - dilma@hiasm.com|0047:
[tab]Формат строки замены в списке замен:
[color=#000080][b]<Заменяемая строка><Delimiter><Строка1><<Enter> или EnterTag>...<Ст
Краткое описание
[tab]Компонент предназначен для множественной замены в тексте
Параметры
[*] [color=blue]ReplaceList[/color] - Список замен по умолчанию
[*] [color=blue]Delimiter[/color] - Разделитель элементов в каж
Методы
[*] [color=blue]doMultiReplace[/color] - Начинает множественную замену в тексте [color=#008000][b]ARG(Text, ReplaceList)[/b][/co
События
[*] [color=blue]onResult[/color] - Событие происходит всякий раз после окончания множественной замены, выдавая полученный текст
Свойства
[*] [color=blue]Result[/color] - Содержит результат множественной замены
Данные
[*] [color=blue]Text[/color] - Текст для множественной замены
[*] [color=blue]ReplaceList[/color] - Список замен
Пример
[tab]Пример транслита с русского языка на английский язык
[code]
Add(MainForm,2953706,252,385)
{
Width=505
Height=516
==|40: HiAsm 4.04 build 184|47:
==|24:[tab]Лицензионное соглашение|0:|92: Программа HiAsm (в дальнейшем "Программный продукт") создан Dilma (в дальнейшем "Авт
==|
}
Add(Button,15343263,140,434)
{
Left=15
Top=10
TabOrder=-1
link(onClick,13279769:doEvent1,[])
}
Add(Memo,8892279,427,427)
{
Left=15
Top=45
Width=455
Height=425
ScrollBars=2
}
Add(MultiReplace,13466306,329,441)
{
link(onResult,9957346:doEvent1,[])
link(Text,13260997:Text,[(335,429)(314,429)])
link(ReplaceList,14255948:Text,[(342,429)(363,429)])
}
Add(StrList,14255948,357,371)
{
Strings=#53:а=a; б=b; в=v; г=g; д=d; е=e; ё=yo; ж=zh; з=z;|53:и=i; й=y; к=k; л=l; м=m; н=n; о=o; п=p; р=r;|56:с=s; т=t; у=u; ф=f; х=h; ц=c; ч=ch; ш=sh; щ=shch;|53:ь='; ы=q; ъ='; э=ye; ю=yu; я=ya; А=A; Б=B; В=V;|53:Г=G; Д=D; Е=E; Ё=Yo; Ж=Zh; З=Z; И=I; Й=Y; К=K;|53:Л=L; М=M; Н=N; О=O; П=P; Р=R; С=S; Т=T; У=U;|53:Ф=F; Х=H; Ц=C; Ч=Ch; Ш=Sh; Щ=Shch; Ь='; Ы=Q; Ъ=';|17:Э=Ye; Ю=Yu; Я=Ya;|
}
Список замен для транслита с английского языка на русский язык
}
Add(Button,15343263,140,434)
{
Left=15
Top=10
TabOrder=-1
link(onClick,13279769:doEvent1,[])
}
Add(Memo,8892279,427,427)
{
Left=15
Top=45
Width=455
Height=425
ScrollBars=2
}
Add(MultiReplace,13466306,329,441)
{
link(onResult,9957346:doEvent1,[])
link(Text,13260997:Text,[(335,429)(314,429)])
link(ReplaceList,14255948:Text,[(342,429)(363,429)])
}
Add(StrList,14255948,357,371)
{
Strings=#53:а=a; б=b; в=v; г=g; д=d; е=e; ё=yo; ж=zh; з=z;|53:и=i; й=y; к=k; л=l; м=m; н=n; о=o; п=p; р=r;|56:с=s; т=t; у=u; ф=f; х=h; ц=c; ч=ch; ш=sh; щ=shch;|53:ь='; ы=q; ъ='; э=ye; ю=yu; я=ya; А=A; Б=B; В=V;|53:Г=G; Д=D; Е=E; Ё=Yo; Ж=Zh; З=Z; И=I; Й=Y; К=K;|53:Л=L; М=M; Н=N; О=O; П=P; Р=R; С=S; Т=T; У=U;|53:Ф=F; Х=H; Ц=C; Ч=Ch; Ш=Sh; Щ=Shch; Ь='; Ы=Q; Ъ=';|17:Э=Ye; Ю=Yu; Я=Ya;|
}
#sha
Add(StrList,4872241,315,357)
{
@Hint=#17:translit en -> ru|
Strings=#9:shch = щ;|11:tsya = тся;|12:dniy = дный;|10:aya = ая;|10:iya = ия;|10yu = ою;|10ya = оя;|11:tst = тст;|11:tsk = тск;|9:tch = ч;|11:dya = дья;|11:tya = тья;|10yo = оё;|11:liy = лый;|10:nb = нь;|9:ya = я;|9:yo = ё;|9:yu = ю;|9:ja = я;|10:je = же;|10:ju = жу;|10:ji = жи;|9:kh = х;|9:zh = ж;|9:ts = ц;|9:tz = ц;|9:tc = ц;|9:ch = ч;|9:sh = ш;|10:zj = зь;|10:ay = ай;|10:ey = ей;|10:iy = ий;|10y = ой;|10:uy = уй;|10:yy = ый;|9:q = к;|9:w = в;|9:e = е;|9:r = р;|9:t = т;|9:y = ы;|9:u = у;|9:i = и;|9 = о;|9:p = п;|9:a = а;|9:s = с;|9:d = д;|9:f = ф;|9:g = г;|9:h = х;|9:j = й;|9:k = к;|9:l = л;|9:z = з;|10 = кс;|9:c = ц;|9:v = в;|9:b = б;|9:n = н;|9:m = м;|9:' = ь;|
AddHint(52,-28,84,13,@Hint)
}
Замечания
Формат строки замены в списке замен:
<Заменяемая строка><Delimiter><Строка1><<Enter> или EnterTag>...<СтрокаN><EndSymbol>.
Например, где знак "=" - Delimiter, ";" - EndSymbol; "<#13#10>" - EnterTag:
Однострочная замена:
Подпись1=Все хорошо, что хорошо кончается;
Многострочная замена;
Подпись2=Все течет, все изменяется
А лучшее, все же - враг хорошего!;
или
Подпись2=Все течет, все изменяется<#13#10>А лучшее, все же - враг хорошего!;
Разрешается писать замены в строку с отделением разделителя и символа окончания пробелами
а = a; б = b; в = v; г = g; д = d; е = e; ё = yo; ж = zh; з = z;
и = i; й = y; к = k; л = l; м = m; н = n; о = o; п = p; р = r;
Для экранирования пробелов в начале или конце блока поиска используется обратная наклонная черта (backslash), например:
... \ - экранирование пробелов справа;
\ ... - экранирование пробелов слева;
\ ... \ - экранирование пробелов с обеих сторон. В данных примерах три точки означают любой текст
Для замены самого символа слеша \ необходимо применить следующую последовательность, состоящую из трех слешей подряд - \\\
Если требуется замена длинных лексем, содержащие в себе более короткие лексемы, которые также необходимо заменить, то необходимо располагать замену длинных лексем перед короткими. Те расставлять замены в списки надо по мере убывания длины лексем (правило длинных лексем). Например: надо заменить 50 и 5, сначала в списке надо поставить замену 50, а после 5, если же поставить наоборот -- 5 перед 50, то замена 5 приведет к замене 5 в 50 исходного текста, и замена 50 не отработает.
По умолчанию компонент работает в однопроходном режиме (1-Way), что можно представить себе как работу множества последовательных элементов Replace. В таком режиме работы могут возникать эффекты "замена в замене", тк компонент последовательно заменяет найденные лексемы во всем тексте. К примеру, необходимо сделать вот такую замену -- a = b; b = c; c = d; в строке abc, компонент сначала заменит все a, на выходе получится bbc, после чего заменит все b, на выходе получится ccc, и наконец, производится замена всех c, на выходе получится ddd, что не совсем соответствует ожидаемуому результату. Для исключения возникновения эффекта "замена в замене" необходимо применять двухпроходный режим (2-Way). В таком режиме, в первом проходе, происходит маркирование лексем в исходном тексте, затем , во втором проходе, маркеры меняются на соответствующие замены. Если применить двухпроходный режим к нашему примеру со строкой abc и списком замен a = b; b = c; c = d;, то на выходе получим bcd. Но тут надо учитывать тот факт, что однопроходный режим работает быстрее двухпроходного.
Внимание! Правило длинных лексем распространяется и на однопроходный, и на двухпроходный режим.
Пример работы компонента в однопроходном и двухпроходном режиме с эффектом "замена в замене"
Обновление элемента: [svn]MultiReplace.pas[/svn]
<Заменяемая строка><Delimiter><Строка1><<Enter> или EnterTag>...<СтрокаN><EndSymbol>.
Например, где знак "=" - Delimiter, ";" - EndSymbol; "<#13#10>" - EnterTag:
Однострочная замена:
Подпись1=Все хорошо, что хорошо кончается;
Многострочная замена;
Подпись2=Все течет, все изменяется
А лучшее, все же - враг хорошего!;
или
Подпись2=Все течет, все изменяется<#13#10>А лучшее, все же - враг хорошего!;
Разрешается писать замены в строку с отделением разделителя и символа окончания пробелами
а = a; б = b; в = v; г = g; д = d; е = e; ё = yo; ж = zh; з = z;
и = i; й = y; к = k; л = l; м = m; н = n; о = o; п = p; р = r;
Для экранирования пробелов в начале или конце блока поиска используется обратная наклонная черта (backslash), например:
... \ - экранирование пробелов справа;
\ ... - экранирование пробелов слева;
\ ... \ - экранирование пробелов с обеих сторон. В данных примерах три точки означают любой текст
Для замены самого символа слеша \ необходимо применить следующую последовательность, состоящую из трех слешей подряд - \\\
Если требуется замена длинных лексем, содержащие в себе более короткие лексемы, которые также необходимо заменить, то необходимо располагать замену длинных лексем перед короткими. Те расставлять замены в списки надо по мере убывания длины лексем (правило длинных лексем). Например: надо заменить 50 и 5, сначала в списке надо поставить замену 50, а после 5, если же поставить наоборот -- 5 перед 50, то замена 5 приведет к замене 5 в 50 исходного текста, и замена 50 не отработает.
По умолчанию компонент работает в однопроходном режиме (1-Way), что можно представить себе как работу множества последовательных элементов Replace. В таком режиме работы могут возникать эффекты "замена в замене", тк компонент последовательно заменяет найденные лексемы во всем тексте. К примеру, необходимо сделать вот такую замену -- a = b; b = c; c = d; в строке abc, компонент сначала заменит все a, на выходе получится bbc, после чего заменит все b, на выходе получится ccc, и наконец, производится замена всех c, на выходе получится ddd, что не совсем соответствует ожидаемуому результату. Для исключения возникновения эффекта "замена в замене" необходимо применять двухпроходный режим (2-Way). В таком режиме, в первом проходе, происходит маркирование лексем в исходном тексте, затем , во втором проходе, маркеры меняются на соответствующие замены. Если применить двухпроходный режим к нашему примеру со строкой abc и списком замен a = b; b = c; c = d;, то на выходе получим bcd. Но тут надо учитывать тот факт, что однопроходный режим работает быстрее двухпроходного.
Внимание! Правило длинных лексем распространяется и на однопроходный, и на двухпроходный режим.
Пример работы компонента в однопроходном и двухпроходном режиме с эффектом "замена в замене"
Add(MainForm,4056909,112,140)
{
Width=565
Height=400
Caption="MultiReplace 1&2-Way"
Position=1
}
Add(Button,14455952,112,189)
{
Left=245
Top=335
TabOrder=-1
Data=String()
link(onClick,1935334:doEvent1,[])
}
Add(Hub,1935334,175,189)
{
link(onEvent1,14699846:doEnum,[])
link(onEvent2,15583860:doEnum,[(207,202)(207,258)])
}
Add(ListBox,12472830,203,91)
{
Left=5
Top=5
Width=130
Height=325
Font=[Courier New,10,0,0,204]
Strings=#3:1=b|3:1=B|9:cdfghijkl|
}
Add(ListBox,14423470,273,91)
{
Left=140
Top=5
Width=130
Height=325
Font=[Courier New,10,0,0,204]
Strings=#12:1=b~test1=B§|12:1=B~TEST1=b§|4:t~1§|4:e~2§|4:s~3§|4:T~4§|4:E~5§|4:S~6§|4:c~d§|4:d~f§|4:f~g§|4:g~h§|4:h~i§|4:i~j§|4:j~k§|4:k~l§|4:l~m§|0:|0:|
}
Add(Label,10866566,105,91)
{
Left=275
Top=5
Width=268
Height=17
Font=[MS Sans Serif,10,1,0,1]
Caption="1-Way"
AutoSize=1
Alignment=2
}
Add(Memo,951728,357,189)
{
Left=275
Top=30
Width=270
Height=135
Font=[Courier New,10,0,0,204]
ScrollBars=3
}
Add(ArrayEnum,14699846,217,189)
{
link(onItem,10281728:doMultiReplace,[])
link(Array,10244938:Var2,[])
}
Add(MultiReplace,10281728,266,189)
{
Delimiter="~"
EndSymbol="§"
link(onResult,951728:doAdd,[])
link(ReplaceList,401679:Var2,[])
}
Add(Label,11240987,112,98)
{
Left=280
Top=170
Width=268
Height=20
Font=[MS Sans Serif,10,1,0,1]
Caption="2-Way"
AutoSize=1
Alignment=2
}
Add(Memo,11718519,357,252)
{
Left=275
Top=195
Width=270
Height=135
Font=[Courier New,10,0,0,204]
ScrollBars=3
}
Add(ArrayEnum,15583860,252,252)
{
link(onItem,7356010:doMultiReplace,[])
link(Array,10244938:Var3,[(258,159)])
}
Add(MultiReplace,7356010,301,252)
{
Delimiter="~"
EndSymbol="§"
Mode=1
link(onResult,11718519:doAdd,[])
link(ReplaceList,401679:Var3,[(314,159)])
}
Add(GetDataEx,10244938,217,154)
{
link(Data,12472830:Array,[])
}
Add(GetDataEx,401679,273,154)
{
link(Data,14423470:Text,[])
}
Обновление элемента: [svn]MultiReplace.pas[/svn]
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)