Lua语言简易集成开发环境--三:代码高亮

代码高亮主要是实现了数字、以及注释关键字这三部分的高亮。
1.通过遍历每一行的每个字符,来识别字符是否为字母、数字或注释,对于字符是关键字、数字或注释进行不同的着色处理,以此来显示在UI框架中。

2.代码首先建立一个while循环,遍历每一行的每个字符。代码根据字符是否是字母,数字和注释,选择不同的处理方式:

如果是字母,使用Character.isLetter()方法判断字符是否是字母,是字母的话使用StringBuffer维护从该字符开始到一段连续字母字符串,并将关键字进行着色处理。

如果是数字,则使用Character.isDigit()方法来判断字符是否是数字,如果是则使用StringBuffer维护从该字符开始到一段连续数字字符串,并将数字内容进行着色处理。

如果是“-”字符,判断后面是否为注释“–”,使用StringBuffer维护从该字符开始到注释结尾的注释字符串,并将注释内容进行着色处理。

3.着色处理时,使用了一个StyleRange数组,记录了不同字符的位置和颜色信息,最终将其应用到UI框架上。

代码实现:

super(parent, SWT.NONE);
        this.keywords = keywords;
        //this.setLayout(new FillLayout());
		
//        // 禁止回车键换行
//        st.addVerifyKeyListener(new VerifyKeyListener(){
//            public void verifyKey(VerifyEvent event) {
//                if(event.keyCode == SWT.CR){
//                    event.doit = false;
//                }
//            }
//        });
        // Tab键失去焦点而不是插入制表符
        st.addTraverseListener(new TraverseListener(){
            public void keyTraversed(TraverseEvent e) {
                if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
                    e.doit = true;
                }
            }
        });
        st.addLineStyleListener(new SQLSegmentLineStyleListener());
    }
    
    private class SQLSegmentLineStyleListener implements LineStyleListener {

        @Override
        public void lineGetStyle(LineStyleEvent event) {
            if(keywords == null || keywords.length == 0){
                return;
            }
            List<StyleRange> styles = new ArrayList<StyleRange>();
            int start = 0;
            int length = event.lineText.length();
            
            while (start < length) {
                if (Character.isLetter(event.lineText.charAt(start))) {//确定字符是否字母
                    StringBuffer buf = new StringBuffer();
                    int i = start;
                    for (; i < length && Character.isLetter(event.lineText.charAt(i)); i++) {
                        buf.append(event.lineText.charAt(i));//将i索引上的字符添加到字符缓存里
                    }
                    //关键字上色
                    if(Arrays.asList(keywords).contains(buf.toString())) {
                        styles.add(new StyleRange(event.lineOffset + start, i - start, color, null, SWT.BOLD));
                    }
                    start = i;
                }
                else if (Character.isDigit(event.lineText.charAt(start))) {//确定字符是否为数字
                    StringBuffer buf = new StringBuffer();
                    int i = start;
                    String Digit="\\d";//正则数字表达式
                    Pattern pattern_Digit=Pattern.compile(Digit);
                    
                    for (; i < length && Character.isDigit(event.lineText.charAt(i)); i++) {
                        buf.append(event.lineText.charAt(i));//将i索引上的字符添加到字符缓存里
                    }
                    Matcher matcher_Digit = pattern_Digit.matcher(buf);
                    //关键字上色
                    if(matcher_Digit.find()) {
                        styles.add(new StyleRange(event.lineOffset + start, i - start, Digitcolor, null, SWT.BOLD));
                    }
                    start = i;
                }
                else if (event.lineText.charAt(start) == '-') {//注释 着色
                    StringBuffer buf = new StringBuffer();
                    String Single="--[^\n]*";//单行匹配正则式
                    //String Multi="--\\[(=*)\\[(.|\\n)*?\\]\\1\\]";//多行注释 
                    Pattern pattern_Single=Pattern.compile(Single);//单行注释匹配
                    //Pattern pattern_Multi=Pattern.compile(Multi,Pattern.DOTALL);
                    int i = start;
                    for (; i < length ; i++) {
                        buf.append(event.lineText.charAt(i));
                    }
                    //System.out.println(buf);
                    Matcher matcher_Single = pattern_Single.matcher(buf);
                    //Matcher matcher_Multi = pattern_Multi.matcher(buf);
                    //单行注释匹配 --xx
                    if(matcher_Single.find()) {
                        styles.add(new StyleRange(event.lineOffset + start, i - start, variableColor, null, SWT.NORMAL));
                    }
                    //多行注释注释匹配 --[[xx]]
//                    if(matcher_Multi.find()) {
//                    	//Matcher matcher = pattern.matcher(buf);
//                    	styles.add(new StyleRange(event.lineOffset + start, i - start, variableColor, null, SWT.NORMAL));
//                    }
                    start = i;
                }
                else{
                    start ++;
                }
            }
      
            event.styles = (StyleRange[]) styles.toArray(new StyleRange[0]);
               
            }

结果展示如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值