标签: parsekit

为iOS 7创建文本编辑器

问题

我需要了解TextKit的工作原理以及如何使用它来构建文本编辑器.我需要弄清楚如何仅绘制最终用户与之交互的可见文本,或者确定如何在不将属性应用于processEditing方法中的整个更改范围的文本的情况下懒惰地将属性应用于可见文本.

背景

iOS 7推出了TextKit.我有一个完全实现TextKit的tokenizer和代码(参考Apple的TextKitDemo项目 - 下面提供了一个链接)......它的工作原理.但是,它真的很慢.在通过NSTextStorage解析文本时,它要求您在processEditing方法中在同一线程上着色已编辑文本的ENTIRE范围.将工作卸载到线程没有帮助.这太慢了.我到了可以仅重新定义修改范围的点,但是如果范围太大,则过程将变慢.在某些情况下,整个文档可能会在更改后失效.

以下是我的一些想法.如果其中任何一个有用,或者可能在正确的方向上推动我,请告诉我.

1)多个NSTextContainers

阅读文档似乎我可以在NSLayoutManager中添加多个NSTextContainer.我假设通过这样做我不仅可以定义可以在NSTextContainer中绘制的行数,而且我还应该能够知道哪个NSTextContainer对最终用户可见.我知道,如果我走这条路,我需要投入大量时间才能看出它是否可行.初步测试表明您只需要一个NSTextContainer.所以我必须子类化NSLayout或创建一个包装器,布局管理器确定哪个文本进入哪个文本容器.呸.此外,我不知道TextKit如何让我知道是时候绘制一个特定的NSTextContainer ...也许这不是它的工作方式!

2)使用NSLayoutManager使范围无效

使用invalidateLayoutForCharacterRange:actualCharacterRange:使layoutManager无效.但这实际上做了什么以及如何卸载文本归属阶段?什么时候让我知道需要突出显示特定文本?另外,我看到NSLayoutManager会懒洋洋地绘制字形......怎么样?什么时候?这对我有什么帮助?如何点击此调用以便在实际布置文本之前我可以将支持字符串归属?

3)覆盖NS​​LayoutManager drawGlyphsForGlyphRange:atPoint:方法.

我真的不想这样做.话虽这么说,在Mac OS X中,NSAttributedStrings具有临时属性的概念,其中样式信息仅用于表示.这加快了突出显示的过程!问题是,它在iOS 7 TextKit框架中不存在(或者它就在那里,我只是不知道它).我相信通过覆盖这种方法,它会给我与使用临时属性所获得的相同类型的速度......因为我可以回答此方法中的所有布局,颜色和格式问题,而无需触及NSTextStorage归因串.唯一的问题是,我不知道这个方法如何与NSLayoutManager类中提供的其他方法相关.它是否保持宽度和高度的状态?当它太小时,它是否会修改NSTextContainer的大小?此外,它仅为已在文本缓冲区中添加的字符绘制字形.它不会重新绘制整个屏幕.它只是它的一小部分......而且非常好.我有一些关于如何使用它的想法...但我真的不想布置字形.这是太多的工作,我没有找到一个很好的例子来做到这一点.

非常感谢您提供的任何帮助.

谢谢你,我列出了过去几年我用过的所有框架和参考资料,这些框架和参考资料帮助我到达了现在的位置,希望它们对你有所帮助.

突出显示框架的语法:

资源:

大多数这些框架都是相同的.它们要么不考虑上下文切换(或者你必须编写包装器以提供上下文),要么它们不修复上下文范围,因为用户修改了文本(例如字符串,多行注释等).最后一项要求非常重要.因为如果标记生成器无法确定哪些范围受更改影响,则最终必须再次解析并归因整个字符串.唯一的例外是Crimson Editor.此标记化程序的问题是它在标记化时不保存状态.在绘制时,算法使用标记来确定绘图的状态.它从文档的顶部开始,直到达到可见的文本范围.不用说,

另一个问题是框架不遵循与Apple相同的MVC模式 - 这是预期的.具有完整工作编辑器的框架都使用由它们构建的API(即GTK,Windows等)提供的钩子,这些钩子为它们提供了绘制到屏幕的哪个部分的位置和时间的信息.在我的例子中,TextKit似乎要求您在processEditing中归因整个更改的范围.

也许我的观察是错误的.(我希望它们是!!)也许,ParseKit,例如,将适用于我需要它做什么,我只是不明白如何使用它.如果是这样,请告诉我!再次感谢!

syntax-highlighting objective-c ios parsekit textkit

15
推荐指数
1
解决办法
2826
查看次数

如何将ParseKit作为私有框架嵌入到Mac App捆绑包中

我需要安装ParseKit在Mac Os X下使用cocoa进行编译,我使用xcode 4.我已经在线搜索但是只有一个安装iPhone解析工具包的指南.在哪里可以找到适用于Mac Os X和/或指南的下载?

cocoa objective-c parsekit

10
推荐指数
1
解决办法
4677
查看次数

这个ParseKit BNF有什么问题?

我正在使用ParseKit作为Objective-C,它采用类似BNF的语法来指定语法:

@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;
Run Code Online (Sandbox Code Playgroud)

包含最后一行会导致错误.基本上我想说一个物体可以是房子或其他东西.非终端元素"其他"应该捕获那些不是房子的字.

我是否以错误的方式讨论"任何地方"的想法?

谢谢!

parsing objective-c bnf parser-generator parsekit

9
推荐指数
2
解决办法
931
查看次数

Parsekit自动完成

给出一个简单的Parsekit语法.

@start = sentence+;
sentence = 'beer' container;
container = 'bottle' | 'cup';
Run Code Online (Sandbox Code Playgroud)

如果我有部分解析beer,是否可以让Parsekit将可能的完成返回到句子?

grammar objective-c ios parsekit

6
推荐指数
1
解决办法
251
查看次数

ParseKit的汇编程序回调如何工作?我应该在哪里存储我在其中的工作?

我应该如何在parsekit中使用回调函数?假设我有以下规则:

expr_s = expr_p '+' expr_s | expr_p ; 
Run Code Online (Sandbox Code Playgroud)

我应该从生成的PKAssembly中弹出3个符号并添加第一个和最后一个数字,然后将答案推回堆栈?
对于上述规则,我应该如何知道导致匹配的第一个或第二个规则?
我不明白ParseKit调用回调函数的顺序.我真的可以使用一些帮助.

感谢Todd的回复,记住你的指示我写了下面的语法和回调函数,用于包含加法和乘法的简单数学表达式:

- (IBAction)press_equals:(id)sender {
NSString *g = @"@start = expr_s; expr_s = expr_p ('+'! expr_p)+ ; expr_p = Number ('*'!     Number)+  ;";
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
NSString *s = @"3*4+4*8";

[p parse:s];

PKAssembly *res = [p parse:s];
NSLog(@"res %@", res);

}



- (void)parser:(PKParser *)p didMatchExpr_s:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);

NSArray *toks = [a objectsAbove:nil];


double total = 0.0;
for (PKToken *tok in toks) …
Run Code Online (Sandbox Code Playgroud)

objective-c parsekit

6
推荐指数
1
解决办法
468
查看次数

具有替换变量的HTML的简单ParseKit语法

对于iOS应用程序,我想解析可能包含UNIX样式变量的HTML文件以进行替换.例如,HTML可能如下所示:

<html>
  <head></head>
  <body>
    <h1>${title}</h1>
    <p>${paragraph1}</p>
    <img src="${image}" />
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个简单的ParseKit语法,它将为我提供两个回调:一个用于直通HTML,另一个用于它检测到的变量.为此,我创建了以下语法:

@start        = Empty | content*;

content       = variable | passThrough;
passThrough   = /[^$]+/;
variable      = '$' '{' Word closeChar;

openChar      = '${';
closeChar     = '}';
Run Code Online (Sandbox Code Playgroud)

我至少面临两个问题:因为variable我最初宣称它是openChar Word closeChar,但它不起作用(我仍然不知道为什么).第二个问题(更重要的是)解析器在找到时停止<img src"${image}" />(即引用字符串中的变量).

我的问题是:

  1. 如何修改语法以使其按预期工作?
  2. 使用标记器更好吗?如果是这种情况,我应该如何配置它?

iphone ios parsekit

5
推荐指数
1
解决办法
468
查看次数

ParseKit.framework不起作用,找不到Foundation.h.

我真的很难过,试图让ParseKit.framework(这个)工作一般,甚至不用去实现它,直到它运行它附带的演示应用程序.

发生了什么是编译器无法找到<Foundation/Foundation.h>或其他东西,我认为标题是在链接框架中.确切错误:"Lexical或Preprocessor Issue:'Foundation/Foundation.h'文件未找到."

这是代码,只是来自ParseKit_Prefix.pch:

    //
    // Prefix header for all source files of the 'ParseKit' target in the 'ParseKit' project.
    //
    #ifdef __OBJC__
        #import <Foundation/Foundation.h>
    #endif
Run Code Online (Sandbox Code Playgroud)

没有什么不寻常的,我把文件路径搞砸了一些怎么样?我重新安装了Xcode,重新下载了ParseKit,没有任何帮助.这里的建议没有做任何事情,这不是这个.当我创建一个新项目或使用一个不同的项目并加载Foundation.framework和#import头时,它工作得很好.如果我取消链接框架,我找不到它再次重新链接.还有其他人有过这种问题吗?我在某处错误地下载了吗?我很难找到Xcode UI链接的东西,苹果必须得到一些令人沮丧的人,所以如果有人有什么他们能想到的请给我一些反馈,我现在非常困惑.

xcode objective-c foundation c-preprocessor parsekit

5
推荐指数
1
解决办法
2319
查看次数

Parsekit或我自己解析?

我正在编写一个应用程序,我需要解析葡萄酒菜单.从我到目前为止看到的,它们都遵循一些结构,诀窍将是定义所有的结构.我现在正在探索使用Parsekit并创建语法,但学习曲线非常陡峭.我认为我不会在接下来的几个星期里把它搞清楚,然后意识到这不是正确的方法.

人们在解析这些事情时想要分享的任何见解/资源?谢谢,奥利维尔

cocoa grammar objective-c parsekit

4
推荐指数
1
解决办法
945
查看次数

将Parsekit添加到Xcode项目中

我正在尝试将Parsekit框架添加到我的OSX Xcode项目中.我之前从未添加过第三方框架,但我无法正常工作.

我将包含的Xcode项目拖到我的"Groups&Files"窗格中,然后选择将它添加到我的项目中.然后我拖到标题Parsekit.framework下面Link Binary With Libraries.然后我双击我的目标应用程序并添加Parsekit为直接依赖项.我还添加libicucore.dylib了一个链接库(正如它在他们的网站上所做的那样).最后,在我的目标信息的Build settings选项卡中,我设置了Header Search Pathsto /Users/path/to/include/directoryOther Linker Flagsto -ObjC -all_load.

将此作为调试版本运行正常,没有错误.但是,当我构建我的应用程序以发布然后尝试运行创建的可执行文件时,应用程序无法加载以下错误消息:

由于出现问题,无法打开MyApp.请与开发人员联系,确保myApp适用于此版本的Mac OS X.

这是崩溃记者的转储:

过程:MyApp [
11658 ]路径:/Users/Garry/Programming/Xcode/Mac/MyApp/build/Release/MyApp.app/Contents/MacOS/MyApp标识符:com.yourcompany.MyApp版本:??? (???)代码类型:X86-64(Native)父进程:launchd [135]日期/时间:
2010-05-24 17:08:08.475 +0100操作系统版本:Mac OS X 10.6.3(10D573)报告版本:自上次报告以来的6个间隔:133300秒自上次报告以来崩溃:自上次报告以来每个应用程序崩溃3次:3匿名UUID:
DF0265E4-B5A0-45E1-8B71-D52A27CFDDCA

异常类型:EXC_BREAKPOINT(SIGTRAP)异常代码:0x0000000000000002,0x0000000000000000崩溃的线程:0

Dyld错误消息:未加载库:@executable_path /../ Frameworks/ParseKit.framework/Versions/A/ParseKit参考自:/Users/Garry/Programming/Xcode/Mac/MyApp/build/Release/MyApp.app/Contents/MacOS/MyApp原因:找不到图像

型号:MacBookPro5,5,BootROM MBP55.00AC.B03,2处理器,Intel Core 2 Duo,2.53 GHz,4 GB,SMC 1.47f2图形:NVIDIA GeForce 9400M,NVIDIA GeForce 9400M,PCI,256 MB内存模块:global_name AirPort: spairport_wireless_card_type_airport_extreme(0x14E4,0x8D),Broadcom BCM43xx 1.0(5.10.91.27)蓝牙:版本2.3.1f4,2服务,2个设备,1个传入串行端口网络服务:AirPort,AirPort,en1网络服务:以太网适配器(en6),以太网,en6串行ATA设备:Hitachi HTS545025B9SA02,232.89 GB串行ATA设备:HL-DT-ST DVDRW GS23N USB设备:内置iSight,0x05ac(Apple Inc.),0x8507,0x24400000 USB设备:内部存储卡读卡器,0x05ac( Apple Inc.),0x8403,0x26500000 USB设备:IR接收器,0x05ac(Apple Inc.),0x8242,0x04500000 …

xcode frameworks compiler-errors objective-c parsekit

3
推荐指数
1
解决办法
1852
查看次数

没有调用ParseKit汇编程序回调:我做错了什么?

我必须掌握ParseKit语法语法(在演示应用程序中玩)我现在正试图让我自己的迷你演示工作,但到目前为止没有太大的成功.汇编程序回调没有被调用.

以下是相关代码的精简版.当testParse运行解析器似乎做的事情确定,正确地匹配我的字符串到我的anything生产(这也适用于演示),但didMatchAnything:只是没有得到调用.

#import <Foundation/Foundation.h>

@class PKParser;

@interface FileParserThing : NSObject {
    PKParser* _parser;
}
- (void)testParse;
@end


#import <ParseKit/ParseKit.h>
#import "FileParserThing.h"

@interface FileParserThing ()
@property (nonatomic, retain)PKParser* parser;
- (void)didMatchAnything:(PKAssembly *)a;
@end

@implementation FileParserThing

@synthesize parser = _parser;

-(id)init
{
    if (!(self = [super init])) return nil;

    NSString *g = @"@start = anything; anything = Any+;";
    self.parser = [[PKParserFactory factory] parserFromGrammar:g assembler:self];

    return self;
}

- (void)testParse
{
    NSString *s = @"Foo Bar";
    NSLog(@"test …
Run Code Online (Sandbox Code Playgroud)

macos parsing objective-c parsekit

3
推荐指数
1
解决办法
204
查看次数