Заработай на задачках

Так как в блоге часто используется исходный код, то мне нужна была настройка корректного вывода тега code.

Настройка тега code в css wordpress

Начал я с css, изменив атрибуты тега в style.css темы wordpress:

code{ font-family: monospace; /*использовать моноширинный шрифт*/ text-indent: 0px; /*без отступа красной строки*/ white-space: pre-wrap; /*сохранить символы форматирования и переносить длинные строки*/ display: block; /* отображать в блоке */ /* background-color: #e9e9e9; /*цвет фона*/ */ border: 4px solid #e9e9e9; /* ширина, тип и цвет рамки */ padding: 3px; /*отступ текста от краёв рамки */ font-size: 10px; /*размер шрифта*/ color: #000000; /*цвет шрифта*/ }

К сожалению, wodpress дополнительно обрабатывает текст редактора и вставляет теги p и br, где ему кажется это нужно. Поэтому получалась следующая ситуация: br и атрибут white-space: pre-wrap в теге code суммировались и давали на выходе два перевода строки. В итоге между отдельными строками исходного кода отображалась пустая строка.

В интернете эту проблему решали плагинами и комментированием строчки:

add_filter( 'the_content', 'wpautop');

В файле wp-includes/default-filters.php самого движка. Плагины я ставить не хотел, ибо задача должна решаться тривиально. Комментировать строчку тоже – это решало проблему, но тогда wordpress не расставлял теги p и br везде, что бы потребовало редактирование всех постов.

Игнорирование добавления тегов br и p при обработке тега code

Поэтому я открыл файл wp-includes/formatting.php и нашел функцию wpautop, там уже была нужная мне обработка тега pre. После неё добавил аналогичную обработку для code:

/* * Содержимое тега code не форматируем */ if ( strpos($pee, '<code>') !== false ) { $pee_parts = explode( '</code>', $pee ); $last_pee = array_pop($pee_parts); $pee = ''; $i = 0; foreach ( $pee_parts as $pee_part ) { $start = strpos($pee_part, '<code>'); if ( $start === false ) { $pee .= $pee_part; continue; } $name = "<code wp-code-tag-$i></code>"; $pre_tags[$name] = substr( $pee_part, $start ) . '</code>'; $pee .= substr( $pee_part, 0, $start ) . $name; $i++; } $pee .= $last_pee; }

Это немного китайский способ, но я не знаю php =( Зато всё работает без отключения форматирования движком везде и не нужно вставлять дополнительные теги, что требуют некоторые плагины :)

Однако осталась одна проблема – внутри тега необходимо заменять html-символы, типа < или >. Это я попробовал решить в другом посте.

Я буду очень рад комментарию!

Не переживайте, e-mail нигде не отображается. Обязательные поля помечены *

Навигация по записям