Трындец. Решил я значит у себя на сайте добавить раздел о вебдизайне, т.к. про фотошоп мне надоело искать статьи, а про иллюстратор никто не читает. Нашел по быстрому простенькие статьи по вебдизайну, отправил на перевод и начал пробовать опубликовать тестовую статью. Главная задача таких уроков — это показать доступно html-код, css-код и т.п.
И представьте мое удивление, когда я узнал, что не могу в статье читателю показать код ХТМЛ. Дело в том, что любые HTML-сущности, перед выводом на странице приобразуются к символьному виду.
К примеру, я хочу вывести зрителю такой код:
1 |
[crayon-670e837007f8e270178848 inline="true" ]<p>Привет, Даннеовцы!</p> |
[/crayon]
Для этого я заменяю все «<» и «>» на «<» и «&qt;«. Иначе читатель увидит просто строку: «Привет, Даннеовцы!», т.к. браузер интерпретирует строку как хтмл-код. А движек danneo (будь он неладен), преобразует это дело обратно к символам. Иными словами, на даннео вы без вмешательства программиста не сможете публиковать уроки с примерами хтмл-кода. Так благодаря этому справочная статья про спецсимволы стала бесполезна для веба.
Ну как нормальный пацан, пошел на сайт разрабов в поисках помощи. Но это оказалось бесполезно, т.к. разрабам пох. Вопрос такой уже поднимался и не раз, но на него молчание годичной давности. Понял, что придется что-то самому думать.
Решение получилось достаточно простое. Для подсветки синтаксиса я использую и здесь и на сайте один и тот-же скрипт (highlight.js). А для его работы, чтобы вывести код с подсветкой синтаксиса его необходимо заключить в теги: <pre> и <code>. Например, чтобы вывести предыдущий блок с кодом я использую такую строку:
1 |
[crayon-670e837007f93648883888 inline="true" ]<pre><code>&lt;p&gt;Привет, Даннеовцы!&lt;/p&gt;</code></pre> |
[/crayon]
Отсюда видно, что любой блок примера кода заключен внутри тега <code>. Соответственно я решил все что заключено внутри этого тега приводить к html-сущностям. Для этого добавил к даннеовскому api (base\danneo.initapi.php) такую функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[crayon-670e837007f97395371719 inline="true" class="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; } |
[/crayon]
Эта функция может и не сильно грамотно написана, но она работает и ищет в тексте все блоки с кодом и заменяет внутри них спецсимволы на хтмл-сущности. А дальше в выводе статьи (mod\article\index.php) вместо строк:
1 2 |
[crayon-670e837007f9b592947407 inline="true" class="php"]$textmore = $api -> siteuni($item['textmore']); $textshort = $api -> siteuni($item['textshort']); |
[/crayon]
Ставлю строки:
1 2 |
[crayon-670e837007f9f201951199 inline="true" class="php"]$textmore = $api -> textcode($api -> siteuni($item['textmore'])); $textshort = $api -> textcode($api -> siteuni($item['textshort'])); |
[/crayon]
В результате теперь я могу нормально выводить примеры кода HTML. Потом еще немного подумав решил использовать эту функцию только в разделе по вебдизайну.
Вот и спрашивается, о чем думали даннеовцы, когда придумали все хтмл-сущности приводить к символам? А то, каждый раз, когда я говорю, что даннео — цмс нефига не супер, мне на серче дают минуса в репу. А ведь я не слыхал, чтобы была такая проблемма хоть еще в одной CMS. В даннео есть всего один плюс. Но он правда не слабый. Это её легкость и при посещалке в 4к и просмотрах 16-20к в сутки, сайт не требует себе выделенного сервера.
интересно а обратно как можно заменить сущности на html
Так функция html_entity_decode заменяет все сущности на соответствующие символы.
Кстати, у решения, что здесь написано нашелся недостаток. Русские буквы косячат с кодировкой. Но я не разбирался в чем дело.
Спасибо!!! Очень помог!!!