2016-12-10 3 views
0

ich in XML arbeiten, und ich möchte die automatische Vervollständigung Vorschläge für die Attribute für bestimmte Knotentypen mit AS3 bereitzustellen.Einfache Autovervollständigung mit Ace Editor in AS3?

Zum Beispiel, wenn der Benutzer hat einen Cursor in dem folgenden Knoten:

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

I automatische Vervollständigung möchte "Breite, Höhe, x, y" zeigen.

Ich versuche, die Knotennamen und Namensraum zu bekommen und dann dem Editor eine Liste der Attribute geben, die in der automatischen Vervollständigung erscheinen sollen.

fand ich ähnliche Fragen, aber diejenigen, die einen Service-Aufruf und ein paar verwenden, die veraltet sind. Ich kann diese Frage löschen, wenn es sich um ein Duplikat handelt.

Ace Editor für AS3 here.

Antwort

0

In meinem Fall für AS3, ist es eine Kombination von Elementen:

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; 
} 

Die getQNameFromCursorPosition() Methode ist zerbrechlich, und ich bin auf der Suche in eine neue Methode, um die jumpToMatching() Methode.