Здравствуйте, DragonFire, Вы писали:
DF>Класс RangeTranslator предназначен для хранения информации о взаимном расположении символов в двух строках.
DF>Метод HtmlUtil.Parse вам предстоит написать, или найти что-то похожее, я затрудняюсь сказать делали мы где-то такое или нет. Наверное делали =)
DF>За образец можете взять ClrRegexLexer и логику из CSharpLiteralWrapper.
DF>Аналогично вы сможете склеивать результирующую строку из кусочком, только нужно правильно ренжи сохранять =)
DF>Если будут какие-то специфичные вопросы, пишите мне в скайп skype.stepanov.ev
Спасибо за такой развёрнутый ответ и предложение о помощи. Если не получиться постучусь.
В моём случае RangeTranslator ключевое звено, которого мне не хватало. С ним всё становится на свои места.
Создал свой лексер, фабрику лексера, переопределил CreateInjectedFileAndContext функцию в моём PsiProvider — валидация заработала.
Есть 2 проблемы с quick fixes:
1. Html quick fixes ничего не знают про RangeTranslator.
Предположим quick fix добавляет новый html атрибут class="centered", он добавляет его не encoded вместо class="centered"
<TABLE class="centered" ></TABLE>
но это не критично, тупо добавил дополнительный encoding
2. Есть ещё одна проблема с html сохранённым в xml. После вызова Regenerate функции в моём PsiProvider, xml меняется,
но почему-то не перезапускается html анализ.
Предположим есть нода у которой есть 2 хайтлайтинга на cellpadding и cellspecing и 2 quick fixes.
После применения первого фикса,второй хайглайтинг пропадает, только после сохранения, он снова появляется.
<Table><!CDATA[<table cellpadding=1 cellspasing=0></table>]]></Table>
public override void Regenerate(IndependentInjectedNodeContext nodeContext)
{
var xmlTag = (IXmlTag)nodeContext.OriginalContextNode;
var factory = XmlElementFactory.GetInstance(nodeContext.OriginalContextNode);
var tagText = string.Format("<dummy><![CDATA[{0}]]></dummy>", XmlUtil.UnescapeXmlString(nodeContext.GeneratedNode.GetText()));
IXmlTag dummyTag = factory.CreateRootTag(tagText);
LowLevelModificationUtil.ReplaceChildRange(xmlTag.InnerXml.First(), xmlTag.InnerXml.Last(), dummyTag.InnerXml.ToArray());
}
P.S Не слишком ли накладно для каждого xml нода где есть html создавать свой IHtmlFile?
В принципе у меня файлы не большие и не очень критично, просто интересно.