2016-12-10 49 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()方法。