В этом случае проблема не в вашем правиле, а в том, что ваша вставка после каждого изменения тега меняет положение в той точке, где вы выполняете вставку.
Для иллюстрации:
>> probe parse str: "abd" ["ab" mark: (insert mark "c") "d"] probe str
false
"abcd"
== "abcd"
Вставка верна, но после вставки правило синтаксического анализа все еще находится на позиции 2, а перед тем, где было только "d", теперь есть "cd" и правило не выполняется. Три стратегии:
1) Включить новый контент:
>> probe parse str: "abd" ["ab" mark: (insert mark "c") "cd"] probe str
true
"abcd"
== "abcd"
2) Рассчитайте длину нового контента и пропустите:
>> probe parse str: "abd" ["ab" mark: (insert mark "c") 1 skip "d"] probe str
true
"abcd"
== "abcd"
3) Измените положение после манипуляции:
>> probe parse str: "abd" ["ab" mark: (mark: insert mark "c") :mark "d"] probe str
true
"abcd"
== "abcd"
Номер 2) будет самым быстрым в вашем случае, поскольку вы знаете, что длина вашей строки равна 16:
rule: [
any [
{<pre:myTag} ; opens tag
any [ ; eats through all attributes
any letter {"} any letter {"}
]
mark: ( ; mark after the last attribute, pause (input)
print {clipboard... after any letter {"} any letter {"}}
write clipboard:// mark
input
)
any spacer mark: ; space, mark, print, pause
(print "clipboard..." write clipboard:// mark input)
[ ; close tag
"/>"
|
">" any spacer </pre:myTag>
]
any spacer ; redundant without /all
(insert mark { Visible="false"})
16 skip ; adjust position based on the new content
]
to end
]
Примечание: это то же правило, что и у вас, только с добавленным [16 skip].