Здравствуйте, 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><TAB|LE CELLSPACIN|(0)G=0 CELLPADDIN=0 CLASS=PDS_COMBO_TABLE></TABLE></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);
}