iOS Developer

自定义标签解析

2017-03-01  本文已影响49人  dkStart

最近在工作中需要在应用中外接蓝牙打印设备,实现打印功能。大体流程就是把app中的数据进行解析,处理成打印机的一系列指令。我们采用自定义标签实现了该功能。例如<dk-prt-text style = "center;">cdcd</dk-prt-text>就代表打印居中文字cdcd。<dk-prt-img src="xx" style="center"/>就是打印一个居中的图片。打印过程的难点就是在处理标签的过程。

由于打印的过程不外乎分为打印文字和打印标签,所以可以采取递归的方式进行处理问题,递归结束的标志为内容字符串的长度为0;代码如下:

  - (void)parseContent:(NSString *)content command:(Command *)command {
  //先判断可以直接打印的内容,即直接打印文字
    NSRange rangeOfTagStart = [content rangeOfString:@"<"]
   
    if (rangeOfTagStart.location != NSNotFound && rangeOfTagStart.location) {
       //直接在command中添加打印内容,代码忽略
       content = [content substringFromIndex:rangeOfTagStart.location];    
    }else {
        //没有找到标签,则说明都是直接打印的文字,则直接进行打印,并设置content = @“”
       return;
    }

    NSRange rangeOfTagEnd = [content rangeOfString @">"];
    NSString *tagString = @"";
    
    if (rangeOfTagEnd.location != NSNotFound) {
       //如果存在, 则获取标签字符串,并对tagString赋值
    }else {
     //如果不存在,则直接输出content
        return;
    }

    //1. 对tagString进行格式合法性判断,如果格式合法,则进行下一步,如果格式不合法,则直接输出tagString, 然后递归调用方法,进行下一步处理。
    //2. 获取tagString中的style属性值,写入打印命令中 
    //3. 分别对不同的标签进行处理
    //4. 判断content是否为空,如果为空则发送command到打印机,如果不为空,则进行递归处理
  }

有些关键的点需要特别注意

  1. 标签内属性的处理。

    对于标签内style属性的处理,要思考两个东西,一个是如何获取style中的值,另外一个是style属性的作用范围处理。
    style值的处理,可以简单的使用正则表达式进行处理,style属性的作用范围,对于img这种单个标签来说,打印完图片就直接结束了,然后我们直接在打印命令中输入恢复默认样式的指令即可。但是对于text这种有开始和结束的标签,我们要思考标签嵌套的可能,例如<dk-prt-text style="small">hdcd<dk-prt-text>CDCD</dk-prt-text></dk-prt-text>,我的想法是创建一个可变数组,遇到一个<dk-prt-text>,则保存这个标签中的style属性值,为空也进行保存。遇到一个\<dk-prt-text>则删除数组中的最后一个元素,使用倒二个属性值进行设置处理。如果删除最后一个元素后,数组为空,则使用默认的属性值进行设置。

上一篇下一篇

猜你喜欢

热点阅读