|
Персональные инструменты |
|||
|
Как сделать правильную раскраску кода на «Хабре» и почему это так сложноМатериал из CustisWikiАвторы статей на «Хабре» часто жалуются, что встроенный редактор текстов на сайте не поддерживает исходную разметку кода и подсвечивает его элементы некорректно. Максим Зинченко, наш разработчик-эксперт, решил эту проблему. В своем посте он рассказал о процессе создания инструмента, который переносит раскраску кода из IDEA в статью на «Хабре», и об особенностях его использования. Подробности — в материале «Как сделать правильную раскраску кода на „Хабре“ и почему это так сложно». Пару месяцев назад я опубликовал свой первый пост на «Хабре». Возможно, кто-то из вас заметит, что код в статье раскрашен необычным образом, а главное — раскрашен правильно, несмотря на то, что встроенный редактор текстов на сайте не поддерживает исходную разметку кода и часто подсвечивает его элементы некорректно. При этом код не вставлен картинкой, как делают некоторые совсем отчаявшиеся писатели. В моем случае сохранить разметку было особенно важно, поскольку статья представляла собой описание работы над кодом. Чтобы решить проблему, я создал инструмент, позволяющий перенести подсветку кода в выбранной схеме из IDEA в статью на «Хабре». Я расскажу о процессе создания инструмента и об особенностях его использования. Зачем все этоНа первый взгляд может показаться, что это делается из озорства, просто потому, что не устраивает стандартная подсветка, реализуемая через тэг В каком-то смысле это, конечно, так, но не совсем. Во-первых, подсветка внутри
Во-вторых, подсветка внутри В то же время реалии таковы, что в статьи нужно вставлять именно куски кода, причем чем они меньше, тем лучше. Читать код без подсветки можно, но зачем. Особенности «Хабр»-разметкиВ IntelliJ IDEA есть встроенная поддержка экспорта кода в HTML. Обычное копирование кода кладет в буфер обмена в том числе раскрашенный код, который можно прочитать как HTML. К сожалению, «Хабр» не разрешает использовать HTML-разметку в статьях напрямую. Причины этого — тайна, покрытая мраком, но, возможно, это связано с унификацией вида статей. Если позволить использовать HTML в статьях, можно будет наверстать такого, что возникнут проблемы с просмотром. Я в целом поддерживаю идею запрета HTML в статьях, но есть нюанс. Ресурс для айтишников, где часто обсуждается код и при этом нет никакого способа корректно вставить его в статью, — это как-то странно. Итак, у нас в распоряжении имеются тэги Стоит ли говорить, что все стандартные способы получить HTML-код из IDEA дают совсем не такой HTML, так что работа по преобразованию предстоит немаленькая. ПодходДля начала стоит сказать слова благодарности автору capslocky за его материал по данной теме. Я не стал использовать предложенный в статье инструмент напрямую, да и вряд ли получилось бы, но благодаря этому материалу я понял всю глубину проблемы и в то же время ощутил ветер надежды. Единственный минус этой публикации — большое количества кода в сочетании с очень скупым разъяснением того, что он делает и зачем. Попробую исправить ситуацию и описать, что вам придется сделать со своей HTML-разметкой кода, если вы захотите привести его к виду, готовому к вставке на «Хабр».
Последний пункт проиллюстрирую примером:
Данный код будет превращен «Хабром» в РеализацияПоначалу задача написания конвертера для произвольного HTML-кода казалась мне довольно сложной. Однако если делать решение под конкретный вариант HTML, то все оказывается не так плохо. Мне удалось сделать все на чистом RegExp, то есть даже без парсинга HTML. Основной проблемой оказалось выявление особенностей «Хабр»-разметки. Чтобы у переводов строк не было стилей, пришлось сделать довольно хитрые замены, которые, наверное, являются самыми непонятными (см. функцию popupBr). Идея в том, чтобы тэги Кроме того, оказалось, что IDEA кладет в буфер обмена не только Rich Text, но и довольно хитрые объекты типа Проект написан на Kotlin и живет здесь. Предложения по усовершенствованию всячески приветствуются! Например, было бы хорошо оформить данный инструмент как плагин для IDEA. Простого способа сделать это я пока не нашел: исходники плагина Copy as HTML, к сожалению, закрыты, а разбираться, как написать такой плагин с нуля, слишком долго. |
||