Тег samp в HTML: для чего нужен, как показать вывод программы и чем отличается от kbd

Тег samp (от английского sample, «образец») отмечает пример вывода программы: сообщение, ошибку, результат команды. Так ответ компьютера отделяют от слов автора и от того, что вводит сам читатель. Тег парный, закрывающий обязателен, собственных атрибутов у него нет. Браузер выводит его моноширинным шрифтом и больше ничего не добавляет.

Чем samp отличается от kbd, как записать вывод в несколько строк, как сделать сеанс, который удобно копировать, как отметить сообщения с подстановкой и логи, как оформить вывод в CSS и когда вместо samp нужен output, - ответы ниже.

HTML
<p>Программа ответила:
  <samp>Файл не найден</samp>.</p>

Тег samp в HTML: что это и для чего нужен

Спецификация HTML описывает samp как пример вывода программы или системы, а справка MDN (на английском) говорит о том же: встроенный текст, который представляет образец, а иногда и цитату вывода программы. Читателю показывают то, что программа написала сама: «Готово», Ошибка 404 или список файлов.

Браузер выводит samp моноширинным шрифтом, прямым, без подчёркивания и фона. Размер такой же, как у code: 13 px, когда у родителя размер не задан в пикселях, а при заданном размере текст равен ему. Подробнее об этом написано в разделе про размер шрифта страницы про code.

Отличить samp от code и kbd по виду нельзя: по умолчанию все три выглядят одинаково. Разница в смысле: code - фрагмент кода, kbd - ввод с клавиатуры, samp - ответ программы. Смысл виден только тогда, когда его отделяют стили или программа, читающая разметку.

Тег samp и kbd: что вводит человек и что отвечает программа

Ввод и ответ идут парой: человек вводит команду ls, программа отвечает списком файлов. Команду отмечают тегом kbd, ответ - тегом samp. Когда показывают целый сеанс, kbd вкладывают в samp: всё, что видно на экране терминала, находится внутри одного samp, а введённое человеком выделено отдельно. Такую запись показывает и справка MDN.

HTML
<pre><samp>user@host:~$ <kbd>ls</kbd>
notes.txt  photos
</samp></pre>

Приглашение командной строки - строка, которую программа выводит перед местом ввода, например user@host:~$. Она остаётся обычным текстом внутри samp: её вывела программа, человек её не вводил. Если нужно показать только то, что ввести читателю, ответ не нужен, достаточно одного kbd.

Пример: сеанс в терминале

Результат

Выберите команду или введите свою. Кадр выполняет её, добавляет в сеанс и показывает разметку последней команды: ввод внутри kbd, приглашение и ответ обычным текстом внутри samp.

Вывод в несколько строк: тег samp внутри pre

Один samp не сохраняет переносы строк: в Chrome текст из двух строк в нём занимает одну строку, а лишние пробелы схлопываются. Для вывода в несколько строк samp записывают внутри pre: pre сохраняет пробелы и переносы, а samp остаётся смысловой пометкой.

HTML
<pre><samp>Готово:
  файлов: 3
  ошибок: 0
</samp></pre>

Порядок вложения один: samp внутри pre. Тег samp строчный, а pre блочный, и блок внутри строчного тега не допускается. Про перенос строки после открывающего тега, отступы и длинные строки подробно написано на странице про pre.

Весь вывод можно оставить в одном samp, а можно отмечать каждую строку отдельным samp. Второй способ нужен, когда строки оформляют по-разному, например обычный вывод и ошибки. Об этом написано в разделе про логи и ответы сервера.

Копирование вывода samp: как не захватить приглашение командной строки

Читатель часто копирует сеанс, чтобы выполнить его в своём терминале. Если приглашение командной строки записано обычным текстом, оно попадёт в копию вместе с командой, и скопированная строка не сработает: приглашение станет частью команды.

Есть два способа исключить приглашение из копии. Его можно записать в span со свойством user-select: none или вывести из CSS через ::before. В Chrome в обоих случаях приглашение остаётся на экране, а в буфер обмена не попадает. Замеры сделаны в Chrome, в других браузерах поведение стоит проверить.

HTML
<samp><span class="prompt">$ </span><kbd>ls</kbd>
notes.txt  photos
</samp>
CSS
.prompt {
  user-select: none;
}

Способ с ::before выводит приглашение из стилей, поэтому в разметке его нет: читатель без стилей и программы, которые читают текст страницы, приглашения не увидят. Способ с user-select оставляет приглашение в тексте страницы, просто оно не копируется.

Пример: что попадёт в буфер обмена

Результат

Три способа записать приглашение. Кадр выделяет весь блок, читает выделение так же, как при копировании, и показывает, что попадёт в буфер обмена.

Тег samp и var: сообщение с подстановкой и подбор тегов для сеанса

В сообщениях, которые показывают в документации, часто есть меняющаяся часть: название файла, номер, адрес. Её отмечают тегом var внутри samp, например Файл название не найден. Читатель понимает, что вместо слова «название» в настоящем сообщении будет его значение.

HTML
<samp>Файл <var>название</var> не найден</samp>

Внутри samp тег var остаётся курсивным, поэтому изменяемая часть заметна в моноширинной строке. Если вы описываете конкретный ответ, где название файла известно, оставляйте его обычным текстом: «Файл notes.md не найден».

Разобрать сеанс по тегам - значит для каждого фрагмента ответить: это ввод человека, ответ программы, изменяемая часть, код или обычное слово. Для каждого ответа свой тег.

Пример: какой тег нужен фрагменту

Результат

Нажимайте на слова в рамках, и тег меняется по кругу. Кадр строит разметку и проверяет, у каждого ли фрагмента подходящий тег.

Тег samp для логов и ответов сервера: обычный вывод и ошибки

Тег samp подходит не только для терминала. Им отмечают строки лога, ответ команды проверки связи, тело ответа сервера, которое вы показываете в документации к API. Пока это вывод, который написала программа, а не код и не ввод, тег выбран верно.

HTML
<pre><samp>{ "status": "ok", "count": 3 }
</samp></pre>

Если у вывода есть обычные строки и ошибки, каждую строку можно отметить своим samp с классом, а вид задать в CSS: обычный вывод остаётся спокойным, ошибка получает цвет. Класс не меняет смысл тега: обе строки остаются выводом программы.

HTML
<pre><samp>Готово: 3 файла</samp>
<samp class="error">Ошибка: диск полон</samp></pre>
CSS
.error {
  color: #c0292e;
}

Ответ сервера в формате JSON или заголовки HTTP - тоже вывод, поэтому им подходит samp внутри pre. А файл настроек, который читатель должен записать у себя, - это code: его не выводит программа, его пишет человек.

Стили тега samp: оформление вывода как в терминале

По умолчанию samp - моноширинный текст без фона и рамки. Размер зависит от родителя: в обычном абзаце 13 px, в заголовке 19,5 px (в полтора раза больше), а если у родителя размер задан в пикселях, текст равен ему. Курсива и подчёркивания нет, но внутри em или i он становится курсивным.

Оформление вывода как в терминале задают на pre, а не на samp: тёмный фон, светлый текст, отступы. Сам samp можно оставить без стилей.

CSS
pre.terminal {
  background: #1F2430;
  color: #e8e6df;
  padding: 12px 16px;
  border-radius: 8px;
}

Ввод и вывод в таком блоке различают цветом: у kbd свой цвет, а samp остаётся основным. Такой вид показан в первом примере этой статьи.

CSS
pre.terminal kbd {
  color: #ffd479;
}

Тег samp или output: результат скрипта на странице

Тег samp отмечает вывод, который показала другая программа. Если результат считает скрипт на вашей странице, например сумму чисел в форме, подходит другой тег - output. Об этом предупреждает и справка MDN.

HTML
<output for="a b">5</output>

Тег output - элемент формы. У него есть свойство value и атрибут for со списком полей, из которых считается результат. При сбросе формы output возвращается к начальному значению, а при отправке формы он не передаётся. У samp этого нет: это только текст. В Chrome у output нет моноширинного шрифта, он выглядит как окружающий текст.

ТегЧто он отмечаетКогда выбрать
sampВывод, который показала другая программаСообщение, ошибка, результат команды
outputРезультат вычисления на вашей страницеСумма в форме, итог калькулятора
codeКодФрагмент, который читатель запишет у себя
kbdВвод с клавиатурыКоманда или клавиша, которую вводит читатель
varПеременная или заполнительМеняющаяся часть сообщения или команды

Пример: output и samp при сбросе формы

Результат

Измените числа и нажмите «Сбросить форму». Поля и output вернутся к начальным значениям, а samp останется с прежним текстом.

Частые ошибки с тегом samp

Ошибки с этим тегом связаны с тем, что его путают с соседями по смыслу и не учитывают переносы строк.

ОшибкаЧто происходитКак исправить
Ввод в теге: <samp>ls</samp>Команду вводит человек, а не выводит программа<kbd>ls</kbd>
Код в теге: <samp>function area(r) {}</samp>Код пишет человек, программа его не выводит<code>function area(r) {}</code>
Результат своего скрипта: <samp id="sum">5</samp>Это результат вычисления на странице, а не вывод чужой программы<output for="a b">5</output>
Несколько строк без pre: <samp>Готово: перенос файлов: 3</samp>Переносы схлопываются, всё выходит в одну строкуЗаписать samp внутри pre
Блок внутри тега: <samp><pre>...</pre></samp>samp строчный, блок внутри него не допускаетсяПоменять местами: <pre><samp>...</samp></pre>
Приглашение записано обычным текстомОно попадает в копию, и скопированная команда не работаетspan с user-select: none или ::before
Меняющаяся часть не отмечена: <samp>Файл название не найден</samp>Читатель не понимает, что слово «название» заменится своим значениемФайл <var>название</var> не найден
samp ради моноширинного шрифта: <samp>Скидка 20%</samp>Тег сообщает, что это вывод программы, а это обычный текстspan с классом и font-family
Ждут, что samp будет выглядеть иначе, чем code и kbdПо умолчанию все три выглядят одинаковоРазличие задать в CSS, смысл оставить в теге
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×