[英]Using character delimiters to find and highlight text in Swift
我以前开发了一个Android应用程序,作为用户的参考指南。 它使用sqlite数据库来存储信息。 数据库存储没有格式化的UTF-8文本(即粗体或带下划线)
为了突出显示所需格式的文本部分,我使用delimiter标记特别为$$括起它们,因为这不会在数据库中显示为信息。 在向用户显示文本之前,我编写了一个方法来查找这些分隔符并为其中包含的文本添加格式并删除分隔符。 所以$$ foo $$变成了foo 。
我的java代码如下:
private static CharSequence boldUnderlineText(CharSequence text, String token) {
int tokenLen = token.length();
int start = text.toString().indexOf(token) + tokenLen;
int end = text.toString().indexOf(token, start);
while (start > -1 && end > -1)
{
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
//add the formatting required
spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, 0);
spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, 0);
// Delete the tokens before and after the span
spannableStringBuilder.delete(end, end + tokenLen);
spannableStringBuilder.delete(start - tokenLen, start);
text = spannableStringBuilder;
start = text.toString().indexOf(token, end - tokenLen - tokenLen) + tokenLen;
end = text.toString().indexOf(token, start);
}
return text;
}
我已经在Swift for iOS中重新创建了我的应用程序,除了显示正确的格式外,它还完成了。 似乎Swift对字符串的处理方式与其他语言不同。
到目前为止,我已尝试将NSString和String类型用于我原始的无格式段落,并设法获取第一个分隔符的范围,开始和结束索引:
func applyFormatting2(noFormatString: NSString, delimiter: String){
let paragraphLength: Int = noFormatString.length //length of paragraph
let tokenLength: Int = delimiter.characters.count //length of token
let rangeOfToken = noFormatString.rangeOfString(formatToken) //range of the first delimiter
let startOfToken = rangeOfToken.toRange()?.startIndex //start index of first delimiter
let endOfToken = rangeOfToken.toRange()?.endIndex //end index of first delimiter
var startOfFormatting = endOfToken //where to start the edit (end index of first delimiter)
}
要么
func applyFormatting(noFormatString: String, token: String){
let paragraphLength: Int = noFormatString.characters.count
let tokenLength: Int = token.characters.count //length of the $$ Token (2)
let rangeOfToken = noFormatString.rangeOfString(formatToken) //The range of the first instance of $$ in the no format string
let startOfToken = rangeOfToken?.startIndex //the starting index of the found range for the found instance of $$
let endOfToken = rangeOfToken?.endIndex //the starting index of the found range for the found instance of $$
var startOfFormatting = endOfToken
}
我很欣赏这段代码冗长而且有无意义的变量,但是当我解决问题时,它可以帮助我思考我的代码。
我目前正在努力研究如何找到第二个/结束分隔符。 我想在特定索引中搜索字符串,就像我在Java中使用该行一样
int end = text.toString().indexOf(token, start);
但是我无法弄清楚如何使用范围来做到这一点。
任何人都可以帮我解决如何正确识别结束分隔符的位置或如何完成代码块格式化所有必需的文本?
谢谢
阿尔
使用NSRegularExpression怎么样?
public extension NSMutableAttributedString {
func addAttributes(attrs: [String : AnyObject], delimiter: String) throws {
let escaped = NSRegularExpression.escapedPatternForString(delimiter)
let regex = try NSRegularExpression(pattern:"\(escaped)(.*?)\(escaped)", options: [])
var offset = 0
regex.enumerateMatchesInString(string, options: [], range: NSRange(location: 0, length: string.characters.count)) { (result, flags, stop) -> Void in
guard let result = result else {
return
}
let range = NSRange(location: result.range.location + offset, length: result.range.length)
self.addAttributes(attrs, range: range)
let replacement = regex.replacementStringForResult(result, inString: self.string, offset: offset, template: "$1")
self.replaceCharactersInRange(range, withString: replacement)
offset -= (2 * delimiter.characters.count)
}
}
}
这就是你怎么称呼它。
let string = NSMutableAttributedString(string:"Here is some $$bold$$ text that should be $$emphasized$$")
let attributes = [NSFontAttributeName: UIFont.boldSystemFontOfSize(15)]
try! string.addAttributes(attributes, delimiter: "$$")
iOS的方法是使用NS[Mutable]AttributedString
。 您可以在文本范围上设置属性字典。 这些属性包括字体粗细,大小,颜色,行间距等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.