我试图在TLF中插入一个链接。通常你只需使用
var linkElement:LinkElement = textArea.textFlow.interactionManager.applyLink( ... );
问题在于,如果我创建一个跨越不同格式的文本(粗体,斜体等)的链接,或天堂禁止跨段落和列表项目,它完全彻底地崩溃和烧伤。链接格式完全丢失,列表结构崩溃。
如果我们要在所选文本中同时保留格式和结构,那么只需通过addChild()添加LinkElement也不起作用。
使用interactionManager.cutTextScrap(...)删除textFlow以进行选择,将其包含在带有interactionManager.applyLink(...)的LinkElement中,然后粘贴"回来...也造成一团糟。
所以我必须创建自己的链接插入例程。
我决心要做的是:
1)将textflow标签转换为字符串
2)在文本流字符串
中找到选择的开始和结束索引3)在起始索引处插入以下字符串:
</span><a href="[hrefVar]" target="[targetVar]"><span>
4)在结束索引处插入以下字符串:
</span></a><span>
5)将textflow字符串重新转换为TextArea的文本流对象
瞧!即时RTF链接!
唯一的问题是......我不知道如何编写正则表达式解析方程式,该方程式可以找到XML标记内字符串匹配的起始和结束索引,其中结果可能会分布在几个标签。
例如,如果TextFlow是(缩写):
<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span>
lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit.
</span></p></TextFlow>
比方说,例如,用户已选择&#34; Ipsum dolor sit amet&#34;转换成链接。我需要找到&#34; Ipsum dolor坐下来的第一个和最后一个索引。在该RTF标记内,然后插入3)&amp;中指示的字符串。 4)以上,最终结果如下:
<TextFlow><p><span>Lorem </span><a href="http://www.google.ca" target="_blank">
<span>Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span>
<span fontStyle="italic">et</span></a><span>, consectetur adipiscing elit.
</span></p></TextFlow>
你可能会丢失一些样式格式,但我可以通过文本流格式化来解决这个问题。
我需要的是正则表达式执行步骤2)。
我知道正则表达式忽略标记并删除标记之间的文本,以及如何在剥离的文本流文本中找到所选文本的字符串匹配...但不知道如何在原始文本中找到匹配索引(未剥离) )textflow string。
任何?
答案 0 :(得分:0)
恕我直言更好的方法是通过字符串而不是试图与正则表达式。 这是一个快速脏的方法,这个代码需要改进,但无论如何它可能会给出指示。 因此,主要目标可能只是“抛弃”标签并匹配文本,但计算过程中传递的许多字符。
//This code might need revision for not to get < and > symbols as fake tags starting and finishing points, also reseting searchwhen text not completly done.
var sourceStr:String = '<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit.</span></p></TextFlow>';
var searchStr:String = "Lorem Ipsum d";
var indexes:Object = firstLast(sourceStr, searchStr);
trace(indexes.startIndex,indexes.finishIndex);
function firstLast(sourceStr:String, searchStr:String):Object
{
var indexCounter:int = -1;
var searchFlag:Boolean = true;
var searchPos:int = 0;
var searchChar:String;
var sourceChar:String;
var startIndex:int;
var finishIndex:int;
for (var i:int = 0; i < sourceStr.length; i++ )
{
indexCounter++;
sourceChar = sourceStr.substr(i, 1);
if (sourceChar == "<")
{
searchFlag = false;
}
else if (sourceChar == ">")
{
searchFlag = true;
}
if (!searchFlag)
{
continue;
}
searchChar = searchStr.substr(searchPos, 1);
if (sourceChar == searchChar)
{
if (searchPos == 0)
{
startIndex = indexCounter;
}
if (searchPos == searchStr.length - 1)
{
finishIndex = indexCounter;
}
searchPos++;
}
}
return { startIndex:startIndex, finishIndex:finishIndex };
}