将代码呈现为样式化的静态文本

我一直在和几个朋友一起进行一个名为Interview Flash Cards (简称IFC )的宠物项目,此项目旨在为准备即将面试的iOS开发人员提供一种Flashcard工具。 我打算开放该项目的源代码,以便其他开发人员可以参与其中,并添加他们认为可能对iOS社区有益的任何问题和答案,但是……我做起来并不容易。 至少还没有,但是很快。

问题(至少其中之一)

在IFC中,有一个“算法”部分,您会在其中遇到编码挑战,例如

“在整数数组中查找三个最大数字的乘积”

然后,当您翻转卡时,您会看到解决方案。 但是解决方案是在需要时获取存储在AWS上的映像。 这使其他人很难添加算法解决方案,因为他们需要访问我的AWS账户。 此外,随着Swift语言的发展和样式约定的更改,图像将变得过时 。 因此,理想情况下,我们需要一种添加问题和解决方案的方法,以使其易于维护答案。 这种使用静态图像的规则。

可能的解决方案

我意识到,提交PR(算法解决方案只是一个字符串)会使每个人的生活变得更加轻松。 唯一的问题是我需要一种样式化字符串的方式,以便像在Xcode中一样突出显示语法。 这就是Sam Soffes的SyntaxKit出现在🏅中的地方-尽管,对于IFC,我是从 Alexander Hedges的叉子 ,他对其进行了更新以支持Swift 3🙌🏾

SyntaxKit有许多用途,但是对于这种特殊情况,我仅使用其AttributedParser ,它根据初始化器中指定的TextMate语言(tmLanguage)和TextMate主题(tmTheme)接收字符串并设置样式。 样式化的字符串以NSAttributedString的形式返回,并以语法高亮显示。 某些突出显示不是完美的,但是就其突出的功能而言,它应该得到很多好评。

虽然SyntaxKit做了大量的繁重工作,但它仍然将格式留给开发人员-这意味着我需要弄清楚缩进以及何时添加新行。

尝试#1❌

我尝试使代码示例为字符串,并对其扫描了{},()和[]符号,以确定何时换行或向上移动缩进值。 因此,例如

“ func play(videoGame:VideoGame,players:Int){让武器= [\“ pew \”,\“ pew-pew-pew \”,\“繁荣制造商\”,\“ noob tube \”]…}”

我们必须在第一个{之后添加一个新行,然后确保缩进4个空格,因为我们现在已经进入了第一个缩进级别,然后在定义武器时,我们必须在之后移动到一个新行第一个条目,但标记第一个条目的位置[以便下一行从下一行开始,依此类推。。这太麻烦了,无疑会很慢。 尝试1:失败

尝试#2❌

让用户提交代码示例,只需在需要的地方添加换行符,然后让他们在代码中保留所有空格。 就像是:

  “ func doIt(){\ n让stuffToDo = [“吃”,\ n 
“ sleep”,\ n“ repeat”] \ n对于stuffToDo {\ n做(某事)\ n}“

如您在这里看到的,这是一团糟。 对于试图提交简单代码示例的人来说,这不仅会是一个巨大的痛苦,而且还会等待巨大的格式化错误。 所有这些剩余的空间使得无法跟踪要使用的空间并确定是否未对齐。 仅由于用户需要付出的努力, 尝试2:失败。

尝试3 –序列化! ✅

如果在代码的顶行和底行添加引号,您会注意到一些东西。它不会变成字符串。 那是因为文件中的换行符。 但是事实证明,我们可以非常轻松地将代码序列化为字符串。 如您所见,这是最终成功的方法。

  • Option + Command + F(查找并替换)并使用正则表达式模式
  • 首先找到: \ n并替换为:#N
  • 然后找到:{4} (“一个空格” {4}-正好是四个空格的正则表达式) 替换为: #T
  • 几乎在那里,找到:\“并替换为:\\”,然后找到:\\ n并替换为:\\\\ n(这将使用字符串换行符:\ n并将其转换为\\ n)
  • 最后,在代码的一角加上引号

这些步骤采用以下代码:

并变成:

最好的部分是,要反序列化代码,以便字符串在正确的位置包含空格和换行符,我要做的就是使用下面定义的StringLayoutHandler进行查找和替换。 (第30-37行):

想看代码吗?

  • 我的SyntaxKit测试代码
  • 面试抽认卡-随时贡献力量! 🙌🏾
  • 语法Kit-Sam Soffes
  • SyntaxKit-Alexander Hedges的Swift 3支持分支

与往常一样,请随时发表评论,并感谢您的阅读! ☮&❤️