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