Re[6]: [Resharper SDK] Распарсить html сохранённый в xml.
От: ifle  
Дата: 19.06.15 14:21
Оценка:
Здравствуйте, 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?
В принципе у меня файлы не большие и не очень критично, просто интересно.
Отредактировано 22.06.2015 12:28 ifle . Предыдущая версия . Еще …
Отредактировано 22.06.2015 5:49 ifle . Предыдущая версия .
Отредактировано 21.06.2015 19:25 ifle . Предыдущая версия .
Отредактировано 21.06.2015 19:18 ifle . Предыдущая версия .
Отредактировано 21.06.2015 12:10 ifle . Предыдущая версия .
Отредактировано 19.06.2015 19:02 ifle . Предыдущая версия .
Отредактировано 19.06.2015 14:28 ifle . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.