Pretty-printing (или prettyprinting ) — это применение различных стилистических соглашений о форматировании к текстовым файлам , таким как исходный код , разметка и подобные виды контента. Эти соглашения о форматировании могут включать соблюдение стиля отступов , использование разных цветов и шрифтов для выделения синтаксических элементов исходного кода или изменение размера, чтобы сделать контент более удобным для чтения и понимания. Pretty-printers для исходного кода иногда называют форматировщиками кода или украшателями .
Pretty-printing обычно относится к отображению математических выражений, подобно тому, как они были бы набраны профессионально. Например, в системах компьютерной алгебры, таких как Maxima или Mathematica, система может записывать вывод как "х ^ 2 + 3 * х" как " ". Некоторые графические калькуляторы , такие как Casio 9860 series , HP-49/50 series и HP Prime , TI-84 Plus , TI-89 и TI-Nspire , TI-83 Plus с надстройкой PrettyPt [1] или TI-84 Plus с той же надстройкой или ОС с поддержкой "MathPrint", могут выполнять красивую печать. Кроме того, ряд новых научных калькуляторов оснащены матричными экранами, способными выполнять красивую печать, такие как Casio FX-ES series (Natural Display), Sharp EL-W series (WriteView), HP SmartCalc 300s, TI-30XB и Numworks .
Многие программы форматирования текста также могут набирать математические тексты: TeX был разработан специально для высококачественного математического набора .
Pretty-printing в примерах языка разметки обычно ассоциируется с отступами тегов и содержимого строк для визуального определения иерархии и вложенности. Хотя синтаксические структуры языков на основе тегов существенно не различаются, отступы могут существенно различаться из-за того, как интерпретируется язык разметки, или из-за данных, которые он описывает.
В MathML пробельные символы не отражают данные, значение или синтаксис выше того, что требуется синтаксисом XML . В HTML пробельные символы между тегами считаются текстом и анализируются как текстовые узлы в проанализированном результате. [2] Хотя отступы могут быть щедро применены к документу MathML , необходимо принять достаточные дополнительные меры предосторожности при красивой печати документа HTML, чтобы гарантировать, что дополнительные текстовые узлы не будут созданы или уничтожены в общей близости к содержимому или отражающим содержимое элементам тега. Эта разница в сложности нетривиальна с точки зрения автоматизированной операции красивой печати, где не требуются специальные правила или пограничные случаи, как в более простом примере MathML. Пример HTML может потребовать ряда прогрессивных взаимосвязанных алгоритмов для учета различных шаблонов элементов тега и содержимого, которые соответствуют единому стилю и являются единообразными в применении в различных случаях, о чем свидетельствует компонент приложения markup.ts [3], используемый для украшения HTML, XML и связанных технологий для инструмента Pretty Diff .
Программисты часто используют инструменты для форматирования исходного кода языка программирования определенным образом. Правильное форматирование кода облегчает его чтение и понимание. Разные программисты часто предпочитают разные стили форматирования, такие как использование отступов кода и пробелов или позиционирование фигурных скобок . Форматировщик кода или индентор кода преобразует исходный код из одного стиля форматирования в другой. Это относительно просто из-за однозначного синтаксиса языков программирования. Украшение кода включает в себя разбор исходного кода на составные структуры, такие как операторы присваивания, блоки if , циклы и т. д. (см. также поток управления ), и форматирование их способом, указанным пользователем в файле конфигурации.
Code beautifiers существуют как отдельные приложения и встроены в текстовые редакторы и интегрированные среды разработки . Например, различные языковые режимы Emacs могут правильно и привлекательно оформлять отступы блоков кода. [4]
Ранним примером красивой печати была программа Билла Госпера "GRINDEF" ( то есть "grind function") ( около 1967 г.), которая использовала комбинаторный поиск с обрезкой для форматирования программ LISP . Ранние версии работали с исполняемой формой (структура списка) программы Lisp и не обращали внимания на специальные значения различных функций. Более поздние версии имели специальные соглашения о чтении для включения неисполняемых комментариев, а также для сохранения макросов чтения в неразвернутой форме. Они также допускали специальные соглашения о отступах для специальных функций, таких как if
. [5] [6] Термин "grind" использовался в некоторых кругах Lisp как синоним красивой печати. [7]
Во многих проектах с открытым исходным кодом установлены правила для размещения кода. Наиболее типичными являются форматирование GNU [8] и стиль BSD. [9] Наибольшее различие между ними заключается в расположении фигурных скобок: в стиле GNU открывающие и закрывающие фигурные скобки находятся на отдельных строках с одинаковым отступом. Стиль BSD помещает открывающую фигурную скобку в конец предыдущей строки, а за закрывающими фигурными скобками может следовать else . Размер отступа и расположение пробелов также различаются.
Следующий пример показывает некоторые типичные структуры C и то, как различные правила стилей отступов форматируют их. Без какого-либо форматирования это выглядит так:
int foo ( int k ) { if ( k < 1 || k > 2 ) { printf ( "вне диапазона \n " ); printf ( "эта функция требует значение 1 или 2 \n " );} else { printf ( "Переключение \n " ); switch ( k ) { case 1 : printf ( "1 \n " ); break ; case 2 : printf ( "2 \n " ); break ;}}}
Программа отступа GNU выдает следующий вывод при запросе отступа в соответствии с правилами GNU :
int foo ( int k ) { if ( k < 1 || k > 2 ) { printf ( "вне диапазона \n " ); printf ( "эта функция требует значение 1 или 2 \n " ); } else { printf ( "Переключение \n " ); switch ( k ) { case 1 : printf ( "1 \n " ); break ; case 2 : printf ( "2 \n " ); break ; } } }
При форматировании в соответствии с правилами BSD выводится следующий вывод:
int foo ( int k ) { if ( k < 1 || k > 2 ) { printf ( "вне диапазона \n " ); printf ( "эта функция требует значение 1 или 2 \n " ); } else { printf ( "Переключение \n " ); switch ( k ) { case 1 : printf ( "1 \n " ); break ; case 2 : printf ( "2 \n " ); break ; } } }
Связанные концепции
Коммунальные услуги