public void AllowsPhtmlAttributes(string html)
        {
            var ctx    = new PortableHtmlContext();
            var result = PortableHtmlSchema.Validate(html, ctx);

            Assert.AreEqual(PortableHtmlSchemaErorr.None, result.SchemaError);
        }
        public void CoverToString()
        {
            var ctx = new PortableHtmlContext {
                Strategy = PortableHtmlVerificationStrategy.Full,
                Level    = PortableHtmlStrictLevel.AllowLists,
                BaseUri  = new Uri("http://ya.ru/x")
            };

            ctx.TrustedHosts.Add("me.com");
            ctx.TrustedHosts.Add("you.com");
            const string html = "<!--x--><DIV a='1'><p/><a href='javascript:hack()'/></DIV>";

            ctx = PortableHtmlSchema.Validate(html, ctx);
            var result = ctx.ToString();

            Console.WriteLine(result);
            Assert.AreEqual(@"Level : AllowLists
Strategy : Full
IsOk : False
SchemaError : InvalidRootTag, CommentsDetected, RootInline, UnknownAttribute, EmptyElement, UpperCaseDetected, DangerousLink
BaseUri : 'http://ya.ru/x'
Trust : 'me.com'
Trust : 'you.com'
CommentsDetected 0:0/ 
InvalidRootTag 1:10/./ 
UnknownAttribute 1:10/.//@a 
UpperCaseDetected 1:10/./ 
EmptyElement 1:21/./p[1] 
EmptyElement 1:25/./a[1] 
DangerousLink 1:25/./a[1] 
RootInline 1:25/./a[1] 
", result);
        }
        public void DisableUnknownAttributesByDefault(string html)
        {
            var ctx    = new PortableHtmlContext();
            var result = PortableHtmlSchema.Validate(html, ctx);

            Assert.AreEqual(PortableHtmlSchemaErorr.UnknownAttribute, result.SchemaError);
        }
        public void AllowUnknownAttributesWithOption(string html)
        {
            var ctx = new PortableHtmlContext {
                Level = PortableHtmlStrictLevel.AllowUnknownAttributes
            };
            var result = PortableHtmlSchema.Validate(html, ctx);

            Assert.AreEqual(PortableHtmlSchemaErorr.None, result.SchemaError);
        }
        public void InlineNodesDirectlyUnderContainersAreNotAllowed(string html)
        {
            var ctx = new PortableHtmlContext {
                Level = PortableHtmlStrictLevel.AllowExtensions
            };
            var result = PortableHtmlSchema.Validate(html, ctx);

            Assert.AreEqual(PortableHtmlSchemaErorr.InlineInNonTextElement, result.SchemaError);
        }
        public void TablesInParasNotAllowed(string html)
        {
            var ctx = new PortableHtmlContext {
                Level = PortableHtmlStrictLevel.AllowTables
            };
            var result = PortableHtmlSchema.Validate(html, ctx);

            Assert.AreEqual(PortableHtmlSchemaErorr.NestedParaElements, result.SchemaError);
        }
        public void Q295_InvalidInlinesInRow()
        {
            var xml = XElement.Parse("<div>Бла бла <strong>Сергей</strong>\r\n\r\n\r\n<strong>Иванов</strong></div>");
            var ctx = PortableHtmlSchema.Validate(xml, PortableHtmlStrictLevel.TrustAllImages | PortableHtmlStrictLevel.TrustAllLinks);

            Assert.False(ctx.Ok);
            var converted = new PortableHtmlConverter().Convert(xml);
            var x         = XElement.Parse("<div><p>Бла бла <strong>Сергей Иванов</strong></p></div>");

            Console.WriteLine(x.ToString(SaveOptions.DisableFormatting));
            Assert.AreEqual(x.ToString(SaveOptions.DisableFormatting).Replace("\u00A0", " "), converted.ToString(SaveOptions.DisableFormatting).Replace("\u00A0", " "));
        }
        public void StrategySupport(string html, PortableHtmlVerificationStrategy strategy, int errorcount)
        {
            var ctx = new PortableHtmlContext {
                Strategy = strategy
            };
            var result = PortableHtmlSchema.Validate(html, ctx);

            Assert.False(result.Ok);
            foreach (var e in result.Errors)
            {
                Console.WriteLine("{0} {1} {2} {3}", e.Error, e.Line, e.Column, e.XPath);
            }
            Assert.AreEqual(errorcount, result.Errors.Count);
        }
        public void TableSupport(string html, bool result)
        {
            var ctx = new PortableHtmlContext {
                Level = PortableHtmlStrictLevel.AllowLists | PortableHtmlStrictLevel.AllowTables
            };

            ctx = PortableHtmlSchema.Validate(html, ctx);
            Console.WriteLine(ctx);
            if (result)
            {
                Assert.True(ctx.Ok);
            }
            else
            {
                Assert.False(ctx.Ok);
            }
        }
        public void AllowBrIfOptionChoosed(string html, bool result)
        {
            var ctx = new PortableHtmlContext {
                Level = PortableHtmlStrictLevel.AllowBr
            };

            ctx = PortableHtmlSchema.Validate(html, ctx);
            Console.WriteLine(ctx);
            Assert.AreEqual(result, ctx.Ok);
            if (result)
            {
                Assert.AreEqual(PortableHtmlSchemaErorr.None, ctx.SchemaError);
            }
            else
            {
                Assert.AreNotEqual(PortableHtmlSchemaErorr.None, ctx.SchemaError);
            }
        }
        public void CoverManyDeprecatedAttributesInRowInDistinctStrategies()
        {
            var html = "<div><p a='1' b='2'>x</p><p/></div>";
            var ctx  = new PortableHtmlContext {
                Strategy = PortableHtmlVerificationStrategy.Full
            };

            PortableHtmlSchema.Validate(html, ctx);
            Assert.AreEqual(3, ctx.Errors.Count);
            ctx = new PortableHtmlContext {
                Strategy = PortableHtmlVerificationStrategy.ForcedElementResult
            };
            PortableHtmlSchema.Validate(html, ctx);
            Assert.AreEqual(2, ctx.Errors.Count);
            ctx = new PortableHtmlContext {
                Strategy = PortableHtmlVerificationStrategy.ForcedResult
            };
            PortableHtmlSchema.Validate(html, ctx);
            Assert.AreEqual(1, ctx.Errors.Count);
        }
        public void CoverManyNestErrorsInDistinctStrategies()
        {
            var html = "<div><p><p>x<ul>x<li>x</li></ul></p></p></div>";
            var ctx  = new PortableHtmlContext {
                Strategy = PortableHtmlVerificationStrategy.Full, Level = PortableHtmlStrictLevel.AllowLists
            };

            PortableHtmlSchema.Validate(html, ctx);

            Assert.AreEqual(3, ctx.Errors.Count);
            ctx = new PortableHtmlContext {
                Strategy = PortableHtmlVerificationStrategy.ForcedElementResult, Level = PortableHtmlStrictLevel.AllowLists
            };
            PortableHtmlSchema.Validate(html, ctx);
            Assert.AreEqual(2, ctx.Errors.Count);
            ctx = new PortableHtmlContext {
                Strategy = PortableHtmlVerificationStrategy.ForcedResult, Level = PortableHtmlStrictLevel.AllowLists
            };
            PortableHtmlSchema.Validate(html, ctx);
            Assert.AreEqual(1, ctx.Errors.Count);
        }
        private void testSchema(object srcHtml, bool isValid = true, PortableHtmlSchemaErorr error = PortableHtmlSchemaErorr.None, Type exceptionType = null, bool exactState = true)
        {
            var result = (srcHtml is string || null == srcHtml)? PortableHtmlSchema.Validate((string)srcHtml):PortableHtmlSchema.Validate((XElement)srcHtml);

            if (isValid && !result.Ok)
            {
                Console.WriteLine(result.SchemaError);
            }
            Assert.AreEqual(isValid, result.Ok, "Общий статус валидации неверен");
            if (error == PortableHtmlSchemaErorr.None || exactState)
            {
                Assert.AreEqual(error, result.SchemaError, "Статус ошибки валидации неверен");
            }
            else
            {
                Assert.True(0 != (error & result.SchemaError));
            }
            if (null == exceptionType)
            {
                return;
            }
            Assert.NotNull(result.Exception, "Ожидалось исключение");
            Assert.AreEqual(exceptionType, result.Exception.GetType(), "Исключение имеет неверный тип");
            if (PortableHtmlVerificationStrategy.ForcedResult == result.Strategy)
            {
                if (!result.Ok)
                {
                    Assert.AreEqual(1, result.Errors.Count, "Много ошибок для ForceResult");
                }
            }
            if (PortableHtmlVerificationStrategy.ForcedElementResult == result.Strategy)
            {
                if (!result.Ok)
                {
                    var groupped = result.Errors.GroupBy(_ => _.Element);
                    Assert.True(groupped.All(_ => _.Count() == 1), "Множественные ошибки для элемента при ForceElementResult");
                }
            }
        }
        public void Test(string source, string expected)
        {
            var ex = XElement.Parse(expected);

            Assert.True(PortableHtmlSchema.Validate(ex, PortableHtmlStrictLevel.TrustAllImages | PortableHtmlStrictLevel.TrustAllLinks).Ok);

            var phtml = _converter.Convert(XElement.Parse(source));
            var r     = phtml.ToString();

            Console.WriteLine("EXPECTED:\n====================");
            Console.WriteLine(ex.ToString());
            Console.WriteLine("\nRESULT:\n====================");
            Console.WriteLine(r);
            Assert.AreEqual(ex.ToString(SaveOptions.DisableFormatting).Replace("\u00A0", " "), phtml.ToString(SaveOptions.DisableFormatting).Replace("\u00A0", " "));
            var ctx = PortableHtmlSchema.Validate(phtml, PortableHtmlStrictLevel.TrustAllImages | PortableHtmlStrictLevel.TrustAllLinks);

            if (!ctx.Ok)
            {
                Console.WriteLine(ctx.ToString());
                Assert.Fail("No PHTML");
            }
        }
        public void Q345_Invalid_EmptyPara()
        {
            var xml       = XElement.Parse(@"
<div>
  <div>
    <div>Курс доллара и евро уже не первый месяц продолжают стремительно расти, создавая в обществе определенное напряжение.  Редакция «Устава» выяснила у</div>
    <div>экспертов их мнение и попросила дать прогноз на ближайшее будущее.</div>
    <div></div>
    <div>Виктор Немихин, директор Екатеринбургского филиала брокерского дома «Открытие»:</div>
    <div>Вячеслав Вегнер, Депутат Екатеринбургской городской Думы от КПРФ:</div>
    <div></div>
    <div>Александр Макаров, ООО «Форексклуб-Екатеринбург»:</div>
    <div></div>
    <div>Константин Киселев, политолог, заместитель директора по науке Института философии и права УРО РАН</div>
    <div>Игорь Нестерович, Начальник отдела валютно-финансовых операций банка «Кольцо Урала» :</div>
    <div></div>
    <div>Владимир Пронин, управляющий</div>
    <div>кредитно-кассовым офисом  ОАО «БКС Банк», :</div>
    <div></div>
    <div>Илья Белоус:</div>
    <div>Технический анализ график доллар-рубль за последние 11 месяцев</div>
  </div>
  <p class=""c2"">
    <br />
    <strong>Курс доллара и евро уже не первый месяц продолжают стремительно расти, создавая в обществе определенное напряжение.  Редакция «Устава» выяснила у</strong>
    <br />
    <strong> экспертов их мнение и попросила дать прогноз на ближайшее будущее.</strong>
    <br />
  </p>
  <p>
    <br />
    <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/1339318883_bodborka2_21.jpg"">
      <br />
      <img class=""aligncenter wp-image-920 size-full qlevel-8 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/1339318883_bodborka2_21.jpg"" />
      <br />
    </a>
    <br />
  </p>
  <p class=""c3"">
    <br />
    <strong>
      <br />
      <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/90.jpg"">
        <br />
        <img class=""wp-image-816 alignnone qlevel-9 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/90.jpg"" />
        <br />
      </a>
      <br />
    </strong>
    <br />
  </p>
  <p class=""c3"">
    <br />
    <strong>Виктор Немихин, директор Екатеринбургского филиала брокерского дома «Открытие»:</strong>
    <br />
  </p>
  <p class=""c4"">«На данный момент никто точно не знает будет  или не будет  дальше расти курс евро и доллара, просто потому что волатильность  на рынке сейчас очень высокая, происходят существенные колебания  как в ту, так и в другую сторону.</p>
  <p class=""c4"">Ситуация с волатильностью продлится еще долгое время. Во-первых,  это связно со стоимостью нефти, потому что такую динамику  мало кто ожидал, и еще меньше кто понимает. Во-вторых, ЦБ ушел от политики управляемого курса рубля и инфляционного таргетирования. С моей точки зрения это правильный ход , но не в самое удачное время. Рынок должен привыкнуть к новым условиям. Вот сейчас и привыкает.»</p>
  <p>
    <br />
    <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/859507_437164949687421_1809504151_o.jpg"">
      <br />
      <img class=""wp-image-928 size-thumbnail alignnone qlevel-8 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/859507_437164949687421_1809504151_o-150x150.jpg"" />
      <br />
    </a>
    <br />
  </p>
  <p class=""c4"">
    <br />
    <strong>Вячеслав Вегнер, Депутат Екатеринбургской городской Думы от КПРФ: </strong>
    <br />
  </p>
  <p class=""c4"">«Рубль будет ослабевать. В рамках макроэкономики такая ситуация выгодна для балансировки бюджета. А для населения это будет означать подорожание всех услуг, рост стоимости как продуктов питания, так и продукции промышленных предприятий. Мой прогноз рубля против доллара к марту 72-76 руб..»</p>
  <p>
    <br />
    <strong>
      <br />
      <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/makarov_a.jpg"">
        <br />
        <img class=""alignleft wp-image-817 qlevel-9 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/makarov_a.jpg"" />
        <br />
      </a>
      <br />
    </strong>
    <br />
  </p>
  <p>
    <br />
    <strong>Александр Макаров, ООО «Форексклуб-Екатеринбург»:</strong>
    <br />
  </p>
  <p class=""c4"">«Еще 13 января 2014 года ЦБ  решил двигаться по курсу плавающего рубля, и постепенно ЦБ стал уменьшать присутствие ликвидности. Плавающий курс это  хорошо, на ограниченном появляются спекулянты. И все бы ничего, но в мае-июне начались активные санкции. Спрос на иностранную валюту повысился, а приток денег уменьшился, и большинство инвесторов стали выводить деньги с территории нашей страны. Курс полетел в небеса с космической скоростью, что мы сейчас и видим.</p>
  <p class=""c4"">Это нечто непрогнозируемое. В настоящий момент никто не знает, где граница сверху. Формально, пока санкции действуют, курс может не остановиться, пределов роста не существует. В этом есть и положительный момент, прогноз по нашей экономике теперь положительной, потому что стало выгодно производить товары у нас. На самом деле это стоило сделать еще в 2008. Еще один важный момент в том, что если все растет медленно, то люди не пугаются. Поэтому сейчас задача ЦБ, чтобы курс менялся более плавно.»</p>
  <p>
    <br />
    <strong>
      <br />
      <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/1914157_100424239975241_4644417_n.jpg"">
        <br />
        <img class=""wp-image-819 alignnone qlevel-9 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/1914157_100424239975241_4644417_n.jpg"" />
        <br />
      </a>  </strong>
    <br />
  </p>
  <p class=""c4"">
    <br />
    <strong>Константин Киселев, политолог, заместитель директора по науке Института философии и права УРО РАН</strong>:</p>
  <p class=""c4"">«Курс доллара и евро будет расти. Это будет продолжаться до тех пор, пока Путин у власти.»</p>
  <p>
    <br />
    <img class=""wp-image-941 alignnone qlevel-7 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/unnamed.jpg"" />
    <br />
  </p>
  <p>
    <br />
    <strong>Игорь Нестерович, Начальник отдела валютно-финансовых операций банка «Кольцо Урала» :</strong>
    <br />
  </p>
  <p class=""c4"">«Прогнозируя ситуацию на рынке, стоит сказать, что на укрепление рубля может повлиять решение по ключевой ставке, которое должно быть принято 11 декабря на Совете Директоров Банка России. Сейчас рынок находится в ожидании этого решения, повышение ключевой ставки поможет рублю стабилизироваться, так как позиции спекулянтов будут обходиться им дороже. Также в поддержку рубля Банк России использует механизм интервенций. За последнюю неделю объем интервенций составил около 4 млрд. долларов США. Это помогло удержать курс доллара США ниже 54 руб»</p>
  <p>
    <br />
    <strong>
      <br />
      <img class=""wp-image-818 alignnone qlevel-8 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/20380.jpg"" />
      <br />
    </strong>
    <br />
  </p>
  <p class=""c4"">
    <br />
    <strong>Владимир Пронин, управляющий </strong>
    <br />
    <strong>кредитно-кассовым офисом  ОАО «БКС Банк», :</strong>
    <br />
  </p>
  <p class=""c4"">«Есть прогноз ЦБ, если его посмотреть, то цена на нефть составляет 3600 рублей за баррель. То есть эту сумму мы делим на курс нефти и получаем рубль. Если курс будет 85 за нефть, то рубль будет 45. Если курс будет 60 за нефть, то рубль будет тоже 60.</p>
  <p class=""c4"">Дальше ЦБ должен поменять политику, если это, конечно, настоящий ЦБ. Он должен думать не только о своих бюджетных балансах, но и о населении. Если он начнет об этом думать,и у него есть на это ресурсы, то он сможет изменить свою политику, чтобы прийти к сбалансированному курсу рубля. Но 30 рублей за доллар мы не увидим никогда. Курс будет 45-52, так продлится. я думаю, до ближайших выборов точно»</p>
  <p>
    <br />
    <strong>
      <br />
      <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/1512348_675910579191914_6156868296930448263_n.jpg"">
        <br />
        <img class=""size-thumbnail wp-image-930 alignnone qlevel-9 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/1512348_675910579191914_6156868296930448263_n-150x150.jpg"" />
        <br />
      </a>  </strong>
    <br />
  </p>
  <p class=""c4"">
    <br />
    <strong>Илья Белоус:</strong>
    <br />
  </p>
  <p class=""c4"">
    <br />
    <span>«Курс рубля к доллару в течение определенного периода времени будет испытывать волатильность. Это связано с тем, что в процессе участвуют очень мощные финансовые потоки: валютная выручка, импорт, внешний долг, вывоз капитала зарубеж, спекулянты, Центробанк РФ, население. Все эти потоки в последнее время сильно изменяются, создавая движения курса. Вероятно, через несколько месяцев возникнет поток от возврата валюты в Россию из-за рубежа ввиду того, что в России вложения окажутся более выгодными и надежными. Многое зависит и от новостного фона. В декабре, как мы ожидаем, новостной фон по-прежнему будет напряженным, некоторое затишье возможно в январе и феврале с возрастанием напряженности ближе к весне. Долгосрочным фактором нестабильности может оказаться период 2016 года, когда в США пройдут выборы президента, а в России – Государственной думы. Запад будет активизировать давление на Россию, чтобы показать населению свою вовлеченность в мировые процессы и подчеркнуть важность США в мире, одновременно снижая внимание к внутренним проблемам, которых скопилось очень много – и в экономике и в гражданском обществе.</span>
    <br />
    <br class="" qlevel-7 qpos-1"" />
    <br />
    <span>Из всего указанного следует, что декабрь будет плохим для рубля. Возможно, курс рубля будет опускаться до 60 руб./доллар. В январе-феврале курс будет более стабильным и, вероятно, будет находиться в коридоре 50-55 руб./доллар. Ближе к марту, по нашему мнению, будет создана искусственная напряженность в попытке дестабилизировать обстановку в России, в силу чего цены на нефть испытают минимум, а рубль опустится ниже 60 руб./доллар. Однако постепенно низкие цены на нефть начнут приводить к снижению вложений в геологоразведку, в силу чего цены на нефть придется вернуть на уровень не ниже 70 долларов за баррель. Одновременно снизится нагрузка на заемный капитал, и более активно станут возвращаться средства из-за рубежа в рамках законодательства по деофшоризации. Поэтому постепенно курс рубля должен подойти к уровню 50 руб./доллар. Думаю, что летом 2015 года равновесный курс установится вблизи этого значения.</span>
    <br />
    <br class="" qlevel-7 qpos-3"" />
    <br />
    <span>Дальше все будет зависеть от того, как Россия справится с внешними и внутренними задачами. В случае успешной реализации программы импортозамещения курс рубля также будет усиливаться. Если же вероятность успеха программы дестабилизации в России будет увеличиваться, то давление на рубль усилится, так как Запад будет действовать по принципу «чем хуже, тем лучше»».</span>
    <br />
  </p>
  <p class=""c2"">
    <br />
    <strong>Технический анализ график доллар-рубль за последние 11 месяцев</strong>
    <br />
  </p>
  <p class=""c4"">Помимо сбора комментариев специалистов, эксперт Y.com провел собственный обзор динамики курса рубля на основе технического анализа:</p>
  <p class=""c4"">Если просмотреть график доллар-рубль, то становится ясно, что с технической точки зрения картина по доллару была однозначна еще в конце августа: доллар достаточно долго «топтался» на уровнях 36 рублей, находясь в верхних границах устоявшегося с начала года коридора (33-36 рублей).</p>
  <p class=""c4"">На начало сентября стечение обстоятельств привело к тому, что фундаментальные факторы «нельзя было не учесть», и рубль прорвал сопротивление в 36 рублей (на графике это первая красная точка).</p>
  <p class=""c4"">Примечательно, что восходящая тенденция в рамках канала была начата еще в конце июня и тут, судя по всему, сказались Украинские события: история со сбитым Боингом, отправления гуманитарных конвоев и активные боевые действия летом.</p>
  <p class=""c4"">Эта тенденция была в силе вплоть до уровня 42 рублей за доллар, где можно говорить о последовательном снижении курса российской национальной валюты. Плавными темпы ослабления рубля были вплоть до конца октября.</p>
  <p class=""c4"">Начиная с конца октября (вторая красная точка на рисунке) происходит бесконтрольное падение курса рубля с разрывами (гэпами) в ценах, когда открытие торгов начиналось с ажиотажа и заканчивалось им же.</p>
  <p class=""c4"">
    <br />
    <sub>
      <br />
      <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/12.png"">
        <br />
        <img class=""aligncenter wp-image-922 qlevel-9 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/12.png"" />
        <br />
      </a>
      <br />
    </sub>
    <br />
  </p>
  <p class=""c4"">Наиболее показательная ситуация отмечается не на дневном, а на недельном графике рубль-доллар, где практически каждая сеча начиная с сентября отмечена зеленым цветом (рост курса доллара). Однако где-то с уровня 45 рублей за доллар видна красная свеча, за которой следуют две зеленых, причем следующая за красной свеча закрылась в пятницу ростом (на максимумах) и у свечи нет тени.  Такая ситуация может говорить о том, что у участников торгов присутствует известная нервозность, которая может быть вызвана не столько уверенностью в слабости рубля, сколько в перспективах того, что доллар выше 45 рублей вообще возможен.</p>
  <p class=""c4"">
    <br />
    <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/22.png"">
      <br />
      <img class=""aligncenter wp-image-923 qlevel-8 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/22-1024x633.png"" />
      <br />
    </a>
    <br />
  </p>
  <p class=""c4"">Такая нервозность вызвана неопределенностью фундаментальных факторов от которых зависит курс рубля.  Называются разные факторы падения: и политика, и санкции, и налоговые выплаты, и пресловутый «фактор Путина». Но высказывают это все политически озабоченные лица, которым следовало бы взглянуть на график стоимости нефти, чтобы понять, что все, происходящее сейчас с рублем, объясняется рынком нефти. Посмотрите на график стоимости нефти марки «Брент»:  падение полностью коррелирует с падением рубля.</p>
  <p class=""c4"">
    <br />
    <a target=""_blank"" href=""http://ystav.com/wp-content/uploads/2014/12/32.png"">
      <br />
      <img class=""aligncenter wp-image-925 qlevel-8 qpos-0"" src=""http://ystav.com/wp-content/uploads/2014/12/32-1024x702.png"" />
      <br />
    </a>
    <br />
  </p>
  <p class=""c4"">Таким образом, чтобы ответить на вопрос о том, куда будет двигаться рубль, следует проанализировать график нефти:</p>
  <p class=""wp-caption-text"">На графике представлена динамика цен нефти, начиная с 2007 года.</p>
  <p class=""c4"">На графике видно: всё, что сейчас происходит на рынке нефти, является продолжением глобального движения с 2008 года. По пикам цены на нефть прослеживается однозначный нисходящий канал. В конце лета цены на нефть находились у верхней границы, и поскольку предпосылок для роста цен не было, они двинулись вниз. Поддержкой для цены нефти в тот момент являлся уровень 110 долларов за баррель, и когда он был прорван, нефть стремительно покатилась к нижним границам канала.</p>
  <p class=""c4"">Если анализировать график, то поддержкой для цены нефти выступает ориентир в 68-72 доллара за баррель и вероятней всего, если  нефть и сходит на уровень ниже (низшие цены в 2008-2009 годах), то затем поднимется до 80 долларов за баррель. В этом случае следует ожидать постепенного восстановления цен на нефть: как минимум, те уровни, что были пройдены быстрыми темпами должны будут проторговаться. Таким образом, мы считаем, что цены на нефть придут  до уровня 80 долларов за баррель и затем могут восстанавливаться.</p>
  <p class=""c4"">Соответственно, в этом сценарии, относительно рубля мы можем ожидать возврат национальной валюты до 46 рублей за доллар, а возможно и ниже. Тем не менее, возврат к уровням курса 35 рублей за доллар в какой-либо ближайшей перспективе не просматривается.</p>
  <p class=""c4"">Что же касается пугающих 50 рублей за доллар, то мы ожидаем определенной консолидации этих уровней: ухудшения позиций рубля ждать не стоит. Последнее связано с тем, что хоть курс рубля и зависит от цены на нефть практически напрямую, необходимо учитывать, что даже в худшие времена (цена нефти 40 долларов за баррель или даже исторические 12 долларов за баррель) курс рубля всегда находил опору.</p>
</div>");
            var converted = new PortableHtmlConverter().Convert(xml);

            Console.WriteLine(converted.ToString());


            var ctx = PortableHtmlSchema.Validate(xml, PortableHtmlStrictLevel.TrustAllImages | PortableHtmlStrictLevel.TrustAllLinks);

            Assert.False(ctx.Ok);
            ctx = PortableHtmlSchema.Validate(converted, PortableHtmlStrictLevel.TrustAllImages | PortableHtmlStrictLevel.TrustAllLinks);
            Assert.True(ctx.Ok);
        }