2016-08-02 77 views
0

我在做什麼: 在Ace Editor html腳本中收集所有類和id名稱。在Ace Editor HTML腳本中查找所有類和id名稱

現在我的計劃是檢測用戶更改(.on('change'...))並使用光標位置獲取當前令牌。如果令牌不是'未加引用'的'屬性值'類型,我想通過先前的令牌迭代回來,以找到'屬性值'所屬的'屬性名'類型令牌,並確定它是否是一個類或id(我不能檢測'attribute-name'標記的創建,因爲用戶可以在不更改名稱的情況下返回並更改屬性值,並且需要檢測這些更改)。

我可以做任何事情,除了獲得以前的令牌。我查了一些文檔,TokenIterator應該可以做到這一點,但是當我嘗試做類似var iter = new TokeIterator()的操作時,我的控制檯說TokenIterator未定義。我搜遍谷歌一遍又一遍,但沒有找到任何結果。如果真相在那裏,我顯然不會用正確的詞來找到它,但它們是我得到的唯一字。

是否有某種方式構建到Ace以迭代令牌?我知道我在控制檯登錄時看不到編輯器實例對象上的所有屬性和方法,因爲我可以在腳本中使用我無法在該日誌中看到的方法。有沒有那樣做我想要的?

如果不是,我該如何加載TokenIterator?我想類似的東西去,當我試圖用SnippetManager而回它原來其實我不得不這樣做,使其工作:

var tillPageLoaded = setInterval(function() { // Makes sure page doesn't load forever on startup 
    if(document.readyState === 'complete') { 
     clearInterval(tillPageLoaded); 
     ace.config.loadModule('ace/ext/language_tools', function() { 
      editor.insertSnippet(myString); 
     }); 
    } 
}, 5); 

這是同樣的情況?如果是這樣,.loadModules(...)需要什麼?我需要在某處引用腳本嗎?是否需要以其他方式加載?

是否有內置功能的Ace已經可以做我想要的一切了?

除此之外,如果任何人有更好的想法如何去與Ace這個,這些將是非常受歡迎的。

回答

0

您可以通過使用

var TokenIterator = ace.require("ace/token_iterator").TokenIterator 

https://github.com/ajaxorg/ace/blob/master/lib/ace/mode/folding/xml.js#L38其用法的範例中得到TokenIterator。

+0

謝謝,我得到了那個工作。我發現我然後需要做:'var iter = new TokenIterator(editor.session,0,0);'。不幸的是,我發現它對我來說沒有太大的用處,因爲Ace在每次都會重新創建它的標記,所以我必須每次都重新構建數據,然後再次循環使用標記。 – knod

+0

爲什麼重新生成令牌有問題?它只會重新生成由於編輯而發生更改的令牌 –

+0

我希望能夠存儲令牌並繼續檢查它以查看其值是否已更改。如果令牌在每次更改時都被銷燬,我不能這樣做。每次發生更改以檢索令牌時,我都必須評估整個文檔。也許有一些方法可以檢測到新的令牌的創建或破壞舊的令牌,但我不知道它。它只消除了我希望從令牌中獲得的大部分好處。如果沒有別的選擇,我會去做,但否則它可能不值得。 – knod