Так как в блоге часто используется исходный код, то мне нужна была настройка корректного вывода тега 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-символы, типа < или >. Это я попробовал решить в другом посте.