2016-12-10 48 views
0

我正在使用XML,我想为使用AS3的特定节点类型的属性提供自动完成建议。简单的自动完成与AS3中的Ace编辑器?

例如,如果用户是在以下节点的光标:

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

我想自动完成,以显示“的宽度,高度,X,Y”。

我试图获取节点名称和命名空间,然后给编辑器一个应该出现在自动完成中的属性列表。

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

AS3编辑器here

回答

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()方法。