使用AS3中的Ace Editor简单自动完成?

时间:2016-12-10 20:13:43

标签: actionscript-3 flash ace-editor

我正在使用XML,我想使用AS3为特定节点类型的属性提供自动完成建议。

例如,如果用户在以下节点中有一个光标:

 <s:Button label="Hello World"/>

我想自动完成显示“宽度,高度,x,y”。

我正在尝试获取节点名称和命名空间,然后为编辑器提供应在自动完成中显示的属性列表。

我发现了类似的问题,但是那些正在使用服务电话和一些过时的问题。我可以删除这个问题,如果它是重复的。

AS3的Ace编辑器here

1 个答案:

答案 0 :(得分:0)

就我而言,对于AS3,它是项目的组合:

ace.setCompleters(null); // I'm removing existing autocomplete  
ace.addCompleter(codeCompleter); // adding my own

public var autoCompleteErrorMessage:String = "Nothing available";
public function codeCompleter(editor:Object, session:Object, position:Object, prefix:String, callback:Function):void {
    var row:int = position.row;
    var column:int = position.column;

    /*
    if (prefix.length === 0) { 
        callback(null, []);
        return;
    }
    */
    //var myList:Array = {value: "message", caption: "Caption to user", meta: "Type shown", score: "I don't know"};

    var testing:Boolean = false;

    if (testing) {
        callback(autoCompleteErrorMessage, [{value:"addedToStage"},{value:"added"},{value:"adding"}]);
    }
    else {
        callback(autoCompleteErrorMessage, attributes);
    }
}


protected function cursorChangeHandler(event:Event):void {

    var qname:QName = getQNameFromCursorPosition(ace.row, ace.column);
    if (qname==null) {
        if (attributes.length) {
            attributes = [];
        }
        return;
    }

    if (qname) { 
        attributes = getSuggestionListFromObject(classObject);
        autoCompleteErrorMessage = null;
        lastSelectedQName = qname;
    }
}


public static var XML_TAG_NAME:String       = "meta.tag.tag-name.xml";
public static var XML_TAG_OPEN:String       = "meta.tag.punctuation.tag-open.xml";
public static var XML_TAG_CLOSE:String      = "meta.tag.punctuation.tag-close.xml";
public static var XML_ATTRIBUTE_NAME:String = "entity.other.attribute-name.xml";

public function getQNameFromCursorPosition(row:int, column:int):QName {
    var token:Object;
    var line:String;
    var type:String;
    var value:String;
    var found:Boolean;
    var qname:QName;

    for (; row > -1; row--) {
        line = ace.getLine(row);
        column = line.length;

        for (; column>-1; column--) {
            token = ace.getTokenAt(row, column);
            type = token ? token.type : "";

            if (type==XML_TAG_NAME) {
                value = token.value;
                found = true;
            }
        }

        if (found) break;
    }

    if (found) {
        qname = new QName("", value);
    }

    return qname;
}

getQNameFromCursorPosition()方法很脆弱,我正在研究一种使用jumpToMatching()方法的新方法。