HCMessageParser
解析message
并返回一个包含提及、表情和链接的字典。如果传递了blockDone
,将执行异步调用,并填入结果字典中所有网页链接的标题,然后传递给blockDone
。处理完所有网页链接后,如果有任何错误,将传递包含URL字符串作为键、NSError
作为值的字典到块中。
pod install
。Command+R
以在控制台中查看练习结果。Command+U
以运行测试,其中包含长度测试、多语言支持等。使用此pod需要Swift 2.0和iOS 8.0。
HCMessageParser可通过CocoaPods获取。要安装它,只需将以下行添加到Podfile中
pod "HCMessageParser"
测试消息
message = "@bob @john (success) such a cool feature; https://twitter.com/jdorfman/status/430511497475670016 but http://i.amnothing.com is down (frown)"
let result1 = HCMessageParser.parse(message) {
(result2, errors) in
print("Second result of '\(message)':\n\(result2)\nError(s): \(errors)\n")
}
print("First result of '\(message)':\n\(result1)\n")
返回
["links": (
{
url = "https://twitter.com/jdorfman/status/430511497475670016";
},
{
url = "http://i.amnothing.com";
}
), "mentions": (
bob,
john
), "emoticons": (
success,
frown
)]
带有结果字典的回调
["links": (
{
title = "Justin Dorfman on Twitter: \"nice @littlebigdetail from @HipChat (shows hex colors when pasted in chat). https://#/7cI6Gjy5pq\"";
url = "https://twitter.com/jdorfman/status/430511497475670016";
},
{
url = "http://i.amnothing.com";
}
), "mentions": (
bob,
john
), "emoticons": (
success,
frown
)]
和错误字典
["http://i.amnothing.com": Error Domain=NSURLErrorDomain Code=-1003 "A server with the specified hostname could not be found." UserInfo={NSUnderlyingError=0x7ff5b95324a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1003 "(null)" UserInfo={_kCFStreamErrorCodeKey=8, _kCFStreamErrorDomainKey=12}}, NSErrorFailingURLStringKey=http://i.amnothing.com/, NSErrorFailingURLKey=http://i.amnothing.com/, _kCFStreamErrorDomainKey=12, _kCFStreamErrorCodeKey=8, NSLocalizedDescription=A server with the specified hostname could not be found.}]
我使用HipChat账户
(例如superarts.hipchat.com/account
)测试用户名的规则,并使用HipChat网络应用
测试链接等。有很多细节需要讨论,以下是一些我所突出显示的内容。
@user1@user2
是被接受的。我发现的关于HipChat
提及/用户名的潜在问题
,。!
这样的字符被错误地允许,这会导致类似@老板,你来吗
的消息出现问题,因为老板
应该被提及而不是整个句子。请查看Tests.swift
以获取详细信息。Hi @Leo, are you OK?
,并且用户名支持了CJK
字符,因此也应该考虑这一点。HCMessageParser
中,正则表达式\p{L}
能够正确调用,所以我建议HipChat
不应该允许用户名中出现这些字符。不过,是否应该将0-9
替换为\p{N}
还不确定。HipChat
在处理一些CJK
输入法(IME)时也遇到了一些问题,例如百度拼音
。在输入中文字符时,额外的字符会被输入到消息框中。如果支持了CJK
字符,那么支持应该是正确的。HipChat
中,表情符号不区分大小写,这使得(lol)
和(LOL)
被同样对待。尽管要求中未提及是否应该将表情符号转换为小写字符串,但我认为在HCMessageParser
中实现它是个更好的设计。这个行为可以通过标志HCMessageParser.emoticonForceLowercase
来覆盖,它默认设置为true
。详细信息请查看Tests.swift
。CJK
字符不算在内,并且想与团队讨论是否可以接受。http(s)
协议,因为“页面”和“标题”这些词不适用。然而,在HipChat
中支持了许多URL方案(例如不支持的mailto
方案),所以这将是HCMessageParser
的默认行为。HCMessageParser.urlSupportedProtocols.append("ftp")
来添加一个受支持的协议。HCMessageParser.urlSupportedProtocols = HCMessageParser.urlDefaultProtocols
来重置受支持的协议。http://www.test.com/测试
的URL被HCMessageParser
支持,而HipChat
却不支持。http://موقع.وزارة-الاتصالات.مصر/
的URL被HCMessageParser
支持,而HipChat
却不支持。HipChat
会去除引号,在要求中标题也会被截断。我不太确定这里的规则到底是什么,所以我假设它们是urlTitleFilter
包含被列入黑名单的字符。urlTitleMax
设置为50,私有字符串urlTitleEllipsis
设置为...
通常这项工作应该在服务器端执行,所以我假设当消息发送时,库在用户的手机上运行,因此为服务器做一些解析任务。在这种情况下,应用程序不会在短时间内处理大量数据,所以我使用Swift
来做这项工作。然而,如果情况不同,库应该用C语言重写以达到最佳性能。
HCMessageParser 使用 MIT 许可证。有关更多信息,请参阅 LICENSE 文件。