Информация об изменениях

Сообщение Re[6]: [Resharper SDK] Распарсить html сохранённый в xml. от 19.06.2015 14:21

Изменено 22.06.2015 5:49 ifle

Здравствуйте, 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 сохранённым в CData. После вызова Regenerate функции в моём PsiProvider, CData меняется,
но почему-то не перезапускается html анализ.
Предположим есть нода у которой есть 2 хайтлайтинга на cellpadding и cellspecing и 2 quick fixes.
После применения первого фикса,второй хайглайтинг пропадает, только после сохранения, он снова появляется.
Если в хмл ноде не использовать CData, то html анализ работает как надо
  <Table><!CDATA[<table cellpadding=1 cellspasing=0></table>]]></Table>



P.S Не слишком ли накладно для каждого xml нода где есть html создавать свой IHtmlFile?
В принципе у меня файлы не большие и не очень критично, просто интересно.
Здравствуйте, 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=&quot;centered&quot;
   &lt;TABLE class="centered" &gt;&lt;/TABLE&gt;

но это не критично, тупо добавил дополнительный encoding

2. Есть ещё одна проблема с html сохранённым в CData. После вызова Regenerate функции в моём PsiProvider, CData меняется,
но почему-то не перезапускается html анализ.
Предположим есть нода у которой есть 2 хайтлайтинга на cellpadding и cellspecing и 2 quick fixes.
После применения первого фикса,второй хайглайтинг пропадает, только после сохранения, он снова появляется.
Если в хмл ноде не использовать CData, то html анализ работает как надо
  <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?
В принципе у меня файлы не большие и не очень критично, просто интересно.