HCMessageParser 0.1.0

HCMessageParser 0.1.0

测试测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2015年12月
SPM支持SPM

Leo维护。



HCMessageParser

HCMessageParser解析message并返回一个包含提及、表情和链接的字典。如果传递了blockDone,将执行异步调用,并填入结果字典中所有网页链接的标题,然后传递给blockDone。处理完所有网页链接后,如果有任何错误,将传递包含URL字符串作为键、NSError作为值的字典到块中。

用法

  • 要运行示例项目,请克隆仓库,然后首先从Example目录中运行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是被接受的。
  • 除了拉丁和数字字符外,中文、日文、韩文字符也是允许的
  • 不允许使用emoji字符。

我发现的关于HipChat提及/用户名的潜在问题

  • 关于长度:虽然规定提及名称必须在0到50个字符之间,但有效长度实际上是1到49。
  • 关于CJK(中文、日文、韩文)中的标点符号
    • ,。!这样的字符被错误地允许,这会导致类似@老板,你来吗的消息出现问题,因为老板应该被提及而不是整个句子。请查看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字符不算在内,并且想与团队讨论是否可以接受。

URLs / 链接

  • 要求说明“URLs... 与网页标题”,这听起来像只关注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包含被列入黑名单的字符。
    • 标题超过50个字符时应被截断。私有标志urlTitleMax设置为50,私有字符串urlTitleEllipsis设置为...
    • 即使采取这些行动,推特的标题仍然有所不同。我认为不应该再制定任何新的规则。

优化

通常这项工作应该在服务器端执行,所以我假设当消息发送时,库在用户的手机上运行,因此为服务器做一些解析任务。在这种情况下,应用程序不会在短时间内处理大量数据,所以我使用Swift来做这项工作。然而,如果情况不同,库应该用C语言重写以达到最佳性能。

关于

作者

Leo,[email protected]

许可

HCMessageParser 使用 MIT 许可证。有关更多信息,请参阅 LICENSE 文件。