Re[4]: [Resharper SDK] Распарсить html сохранённый в xml.
От: ifle  
Дата: 18.06.15 11:04
Оценка:
Здравствуйте, zhuravlik26, Вы писали:

Z>Здравствуйте, ifle, Вы писали:


I>>Здравствуйте, zhuravlik26, Вы писали:


Z>>>Можно создать injected-psi для этих блоков с языком html. Нужно завести свой SolutionComponent, отнаследовав его от IndependentInjectedPsiProvider, и там описать, что вы хотите инжектить html в ноды, удовлетворяющие нужному критерию.

Z>>>Примером того, как сделать подобное, может служить JsDocInjectedPsiProvider.

I>>Спасибо, то что нужно. Что должны делать функции CanBeGeneratedNode, CanBeOriginalNode?


Z>CanBeGeneratedNode возвращает, является ли переданная ему нода нодой верхнего уровня заинжекченного языка. В вашем случае оно должно быть в стиле "return node is IHtmlFile;"


Z>CanBeOriginalNode возвращает, является ли переданная ему нода той нодой, куда вы повесили инжект. В вашем случае это какая-то xml-нода.


Заинжекченный ноде у меня парсится как HTML. Вот только с оффсетами не совсем в порядке.
Вот пример, что получается.
<Table>&lt;TAB|LE CELLSPACIN|(0)G=0 CELLPADDIN=0 CLASS=PDS_COMBO_TABLE&gt;&lt;/TABLE&gt;</Table>


Хайглайнинг промахнулся, должен был пометить CELLSPACING=0.
Дело в том, что html не храниться в одной ноде, он храниться как текст xml тага. т.е текст по частям находиться в коллекции xmlTag.InnerTextTokens.
Также есть дополнительные смещения из-за ескеппинга html.

Приемр моего кода
public override IInjectedNodeContext CreateInjectedNodeContext(IInjectedFileContext fileContext, ITreeNode originalNode)
{
    var xmlTag = (IXmlTag) originalNode;

    var text = xmlTag.InnerValue;
    if (string.IsNullOrEmpty(text))
        return null;

    
    StringBuffer buffer = new StringBuffer(text);
    LanguageService languageService = HtmlLanguage.Instance.LanguageService();
    if (languageService == null)
        return null;

    return CreateInjectedFileAndContext(fileContext, xmlTag, buffer, languageService, 0, text.Length);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.