• Danneo и HTML-сущности

    Опубликовано 10 июня 2009 Леха Комментариев: 3

    Трындец. Решил я значит у себя на сайте добавить раздел о вебдизайне, т.к. про фотошоп мне надоело искать статьи, а про иллюстратор никто не читает. Нашел по быстрому простенькие статьи по вебдизайну, отправил на перевод и начал пробовать опубликовать тестовую статью. Главная задача таких уроков — это показать доступно html-код, css-код  и т.п. 

    И представьте мое удивление, когда я узнал, что не могу в статье читателю показать код ХТМЛ. Дело в том, что любые HTML-сущности, перед выводом на странице приобразуются к символьному виду.

    К примеру, я хочу вывести зрителю такой код:

    <p>Привет, Даннеовцы!</p>

    Для этого я заменяю все «<» и «>» на «&lt;» и «&qt;». Иначе читатель увидит просто строку: «Привет, Даннеовцы!», т.к. браузер интерпретирует строку как хтмл-код. А движек danneo (будь он неладен), преобразует это дело обратно к символам. Иными словами, на даннео вы без вмешательства программиста не сможете публиковать уроки с примерами хтмл-кода. Так благодаря этому справочная статья про спецсимволы стала бесполезна для веба.

    Ну как нормальный пацан, пошел на сайт разрабов в поисках помощи. Но это оказалось бесполезно, т.к. разрабам пох. Вопрос такой уже поднимался и не раз, но на него молчание годичной давности. Понял, что придется что-то самому думать.

    Решение получилось достаточно простое. Для подсветки синтаксиса я использую и здесь и на сайте один и тот-же скрипт (highlight.js). А для его работы, чтобы вывести код с подсветкой синтаксиса его необходимо заключить в теги: <pre> и <code>. Например, чтобы вывести предыдущий блок с кодом я использую такую строку:

    <pre><code>&lt;p&gt;Привет, Даннеовцы!&lt;/p&gt;</code></pre>

    Отсюда видно, что любой блок примера кода заключен внутри тега <code>. Соответственно я решил все что заключено внутри этого тега приводить к html-сущностям. Для этого добавил к даннеовскому api (base\danneo.initapi.php) такую функцию:

    function textcode($text){
     preg_match_all("/<code[^>]*?>/", $text, $matches);
     $chanks = preg_split("/(<code[^>]*?>)/", $text);
     $text = '';
     foreach  ($chanks as $key => $value){
      $chanks[$key] = explode("</code>", $value);
      foreach  ($chanks[$key] as $key2 => $value2){
       if ($key2==0 && $key!==0) {
        $chanks[$key][$key2] = htmlentities($value2)."</code>";
        }
       $text .= $chanks[$key][$key2];
       }
      $text .= @$matches[0][$key];
      }
     return $text;
    }

    Эта функция может и не сильно грамотно написана, но она работает и ищет в тексте все блоки с кодом и заменяет внутри них спецсимволы на хтмл-сущности. А дальше в выводе статьи (mod\article\index.php) вместо строк:

    $textmore = $api -> siteuni($item['textmore']);
    $textshort = $api -> siteuni($item['textshort']);

    Ставлю строки:

    $textmore = $api -> textcode($api -> siteuni($item['textmore']));
    $textshort = $api -> textcode($api -> siteuni($item['textshort']));

    В результате теперь я могу нормально выводить примеры кода HTML. Потом еще немного подумав решил использовать эту функцию только в разделе по вебдизайну.

    Вот и спрашивается, о чем думали даннеовцы, когда придумали все хтмл-сущности приводить к символам? А то, каждый раз, когда я говорю, что даннео — цмс нефига не супер, мне на серче дают минуса в репу. А ведь я не слыхал, чтобы была такая проблемма хоть еще в одной CMS. В даннео есть всего один плюс. Но он правда не слабый. Это её легкость и при посещалке в 4к и просмотрах 16-20к в сутки, сайт не требует себе выделенного сервера.

    А что еще по теме?

     

    Ответы (3) на “Danneo и HTML-сущности”

    1. интересно а обратно как можно заменить сущности на html

    2. Так функция html_entity_decode заменяет все сущности на соответствующие символы.

      Кстати, у решения, что здесь написано нашелся недостаток. Русские буквы косячат с кодировкой. Но я не разбирался в чем дело.

    3. Сергей

      Спасибо!!! Очень помог!!!

    Оставить комментарий

    :wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!:

    Это не спам. (сделано dimoning.ru)