15

Вопрос звучит странно, я сейчас все объясню.

Вот смотрите вы можете писать теги которые определены стандартом например: <html>,<head>,<body>,<div>,<table>,<span> и т.п.

Но вы можете в принципе писать свои теги не определенные стандартом к примеру: <screen>, <display>, <place> и т.п

Однако мы можем использовать не любые символы в "своих" тегах к примеру: <0car>, <-car>, <машина> - все это будет обработано браузером так: "<твой_тег>"<!--твой_тег-->

Но вернемся к примеру где теги будут корректно приняты, можно также писать <screen100> или <car-> или <car-моя> - ошибок нет браузер корректно их отображает в своем DOM дереве.

Я бы хотел найти правила которые разъясняли поведение моих примеров


Из ресурсов где я искал это https://html.spec.whatwg.org

Однако тут непонятно почему вторым пунктом полностью не описано каким должен быть первый символ, а какие последущие https://html.spec.whatwg.org/multipage/syntax.html#start-tags Но во втором пункте мы видим ссылку и она нас перекидывает на абзац который гласит:

Tags contain a tag name, giving the element's name. HTML elements all have names that only use ASCII alphanumerics. In the HTML syntax, tag names, even those for foreign elements, may be written with any mix of lower- and uppercase letters that, when converted to all-lowercase, matches the element's tag name; tag names are case-insensitive.


Теги содержат имя тега, дающее имя элементу. Все элементы HTML имеют имена, которые используют только буквенно-цифровые символы ASCII. В синтаксисе HTML имена тегов, даже те, что используются для чужих элементов, могут быть записаны любым сочетанием букв нижнего и верхнего регистра, которые при преобразовании во все строчные буквы соответствуют имени тега элемента; Имена тегов не чувствительны к регистру.

Но как вы можете помнить я приводил примеры которые не только содержат ASCII alphanumerics, как это понимать?

MaximPro
  • 3,913

2 Answers2

12

Спеки говорят следующее:

  • Первым символом имени тега должна быть буква ASCII, иначе ошибка. Поведение при ошибке тоже описывается. Потому тег <машина> у вас превращается в тыкву.
  • Следующими символами имени тега могут быть любые, кроме перечисленных включая пробельные символы, слеш /, восклицательный знак и >. Натурально, на все последующие символы не накладывается никаких других каких-то особых ограничений. Потому вы видите что тег <car-моя> обрабатывается без ошибок.

Дальше в определении HTML элемента мы читаем что он может состоять только из букв и цифр ASCII. И в том же абзаце читаем что есть ещё и другие элементы, которые, как можно понять из текста, подчиняются каким-то своим правилам. Цитата:

In the HTML syntax, tag names, even those for foreign elements, may be written with any mix of lower- and uppercase letters that, when converted to all-lowercase, matches the element's tag name; tag names are case-insensitive.

Обратите внимание на использования may, что значит могут, а не shall, должны. Один из видов других элементов - это custom elements. Для них можно найти более конкретное описание ограничений на используемые символы:

 "-" | "." | [0-9] | "_" | [a-z] | #xB7 | [#xC0-#xD6] | [#xD8-#xF6] 
| [#xF8-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x203F-#x2040] 
| [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] 
| [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

Кириллица располагается в диапазоне U+0400–U+04FF, который, как легко видеть, входит в разрешенные.

Потому, да: вы можете использовать кириллицу в названиях тегов везде кроме случая первого символа. Первый символ имени тега должен быть из диапазона [a-z], строго.

Чтобы вообще не было никаких сомнений, документация приводит пример:

Apart from these restrictions, a large variety of names is allowed, to give maximum flexibility for use cases like <math-α> or <emotion->.

В этой цитате явно и однозначно говорится что вы можете использовать теги вида <math-α> или <emotion->.

sanmai
  • 12,320
  • Все верно вы описываете токенизацию входных символов. Но кроме токенизации есть еще правила описанные в https://html.spec.whatwg.org/multipage/syntax.html#start-tags и вот они не сходятся, почему так? – MaximPro Jul 12 '18 at 09:53
  • Если вы делаете нестандартный элемент, то правила по ссылке к нему не относятся. – sanmai Jul 12 '18 at 12:17
  • Чем подкрепляется ваш аргумент (о нестандартном элементе речь)? – MaximPro Jul 12 '18 at 14:13
  • Текстом по вашей ссылке и описанием работы парсера, в котором явно и однозначно не требуется чтобы символы кроме первого были буквами из ASCII. – sanmai Jul 12 '18 at 15:45
  • И который текст из моей ссылки говорит что: "Если вы делаете нестандартный элемент, то правила по ссылке к нему не относятся"? – MaximPro Jul 12 '18 at 15:51
  • @MaximPro дополнил ответ – sanmai Jul 13 '18 at 08:13
  • Я все равно не понял куда конкретно вы ссылаетесь. Который текст черным по белому это явно говорит? – MaximPro Jul 13 '18 at 10:23
  • Смотрите ссылку на определение элемента – sanmai Jul 13 '18 at 12:40
  • Ну и где там речь о каких-либо других элементах? – MaximPro Jul 13 '18 at 15:19
  • знаете вообще даже css реагирует также первая буква класса или id должна быть не цифрой иначе все - ошибка, невалидно, атата так что я думаю что @sanmai наиболее близок к истине.. кроме того правда и то что браузеры работающие на разных движках по разному интерпретируют теги и работают сними так что тут скорее речь не о спецификации а об интерпертации их браузерами и последующей работе с тегами – Broouzer King Jul 13 '18 at 22:19
  • @BroouzerKing речь о спецификации и конкретных вещах. Кроме того я спрашиваю как раз по стандарту который сейчас активен, а он активен для большинства браузеров, в этой спецификации есть пометки в каждой главе какие браузеры поддерживают функционал. И не надо придумывать что браузеры интерпретируют по своему. У браузера есть четкие инструкции и эти инструкции следовать стандарту! – MaximPro Jul 14 '18 at 04:13
  • @MaximPro добавил цитату – sanmai Jul 14 '18 at 07:59
  • Foreign elements - Elements from the MathML namespace and the SVG namespace. То есть это никак не касается custom elements. – MaximPro Jul 14 '18 at 08:02
  • Там написано что это foreign elements могут быть написаны в таком же стиле, но в остальном документ не делает никаких assumptions касаемо обязательного отсутствия других букв в названиях тегов, кроме случая первой буквы. – sanmai Jul 14 '18 at 08:03
  • Это хорошо что вы сказали про custom elements. Дополнил ответ. – sanmai Jul 14 '18 at 08:09
  • Ну я думаю так уже никаких сомнений не должно остаться. @MaximPro – sanmai Jul 14 '18 at 08:12
  • Там где использовано may, речь идет о комбинации имени тега с помощью любого регистра, т.е речи о символах которые не имеют регистра речи не идет и к тому же это относится к foreign elements. Не знаю я все время переводил shall как следует, а must как должен. – MaximPro Jul 14 '18 at 14:52
  • Хорошо, значит эти правила (https://html.spec.whatwg.org/multipage/syntax.html#start-tags) используются для определенных стандартом тегов, но не применяется для custom elements? – MaximPro Jul 14 '18 at 14:56
  • В этих правилах (https://html.spec.whatwg.org/multipage/syntax.html#start-tags) нет ничего, что мешало бы использовать уникод дальше первого символа. – sanmai Jul 16 '18 at 00:15
  • @MaximPro почему вы считаете что правила по ссылке - не сходятся? – sanmai Jul 16 '18 at 00:30
  • Там же конкретно сказано что символы которые там используются это ASCII alphanumeric,и ни о каком юникоде речь не идет. Вот в чем проблема. – MaximPro Jul 16 '18 at 04:33
  • Хотите мы продолжим обсуждение в чате? Если что добавите в свой ответ, то чего мы наговорим. – MaximPro Jul 16 '18 at 04:42
  • В ответе всё сказано, даже цитата из документации приведена где написано черным по белому что в тегах можно использовать уникод, и даже приведены примеры с эмодзи. Ещё раз, цитата из документации с тегами со смайликами. Уж куда тут дальше объяснять! – sanmai Jul 16 '18 at 04:44
8

Боюсь то что вы ищите написано нигде: browsers are known to tolerate and try to interpret all kinds of broken markup.

Это работа движка браузера(советую попробовать ваши теги в разных движках: IE8/9/11 Edge Safari FireFox Chromium) и сравнить результаты. это удобно сделать тут

Недавно боролся с вопросом можно ли ставить <meta> вне <head> или <body> оказывается нельзя, но большинство движков браузеров поймут что я сделал ошибку и переместят <meta> в <head>

Подробнее тут.

sanmai
  • 12,320
Jiraff537
  • 368
  • Написаны в разделе https://html.spec.whatwg.org/multipage/parsing.html#tokenization однако в этой ссылке описывается токенизация входного потока символов. Но мой вопрос звучит в смущении того что есть раздел https://html.spec.whatwg.org/multipage/syntax.html#start-tags в котором тоже описывается (не токенизация) но тоже построение тега. – MaximPro Jul 12 '18 at 07:18