emmet icon indicating copy to clipboard operation
emmet copied to clipboard

Можно ли контролировать последовательность атрибутов при развороте в HTML?

Open nicothin opened this issue 8 years ago • 20 comments

Очень хочется иметь атрибут class всегда самым первым аьрибутом.

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

nicothin avatar Nov 03 '15 11:11 nicothin

Обычно все атрибуты выводятся в порядке их указания в аббревиатуре, за исключением случаев, если для аббревиатуры задан сниппет с другими атрибутами. Тут только менять сами сниппеты и добавлять им пустой атрибут class в нужное место.

sergeche avatar Nov 03 '15 12:11 sergeche

@sergeche label.clasname<label for="" class="clasname"></label> a.classname<a href="" class="classname"></a> a[class=classname href="goo"]<a href="goo" class="classname"></a>

Обычно все атрибуты выводятся в порядке их указания в аббревиатуре,

нет )

а как создать такой сниппет, который сделает, к примеру: a.classname<a class="classname" href=""></a>?

nicothin avatar Nov 03 '15 14:11 nicothin

Потому что для a сниппет: https://github.com/emmetio/emmet/blob/master/lib/snippets.json#L691

Решение: либо удалить этот сниппет (переопределить у себя пустым занчением: "a": null), либо модифицировать его: "a": "<a class=\"\" href=\"\">, но тогда атрибут class будет всегда выводиться. Либо сделать новый сниппет, который не будет содержать никаких атрибутов в элементе <a>.

sergeche avatar Nov 03 '15 14:11 sergeche

Хм... написал "a": null, — http://take.ms/BHuO6 ничего не изменилось: a.classname<a href="|" class="classname"></a>

написал "a": "<a class=\"\" href=\"\">" — http://take.ms/98CIZ неюзабельно: a.classname<a class="" href="">|

написал "a": "<a>", не-не-не-не, Дэвид Блейн, НЕТ: a.classname<a>

Правильно ли я понимаю, что ответ на мой вопрос — «никак»? Или я что-то делаю не так? )

nicothin avatar Nov 03 '15 14:11 nicothin

Сделать удобно — никак, нужно менять ядро, чтобы можно было задавать приоритеты сортировки у атрибутов

sergeche avatar Nov 03 '15 14:11 sergeche

В каком файле копать-то? :)

nicothin avatar Nov 03 '15 15:11 nicothin

Как вариант: https://github.com/emmetio/emmet/blob/master/lib/filter/html.js#L21 В принципе, можно и свой фильтр написать, который сгенерирует правильный вывод, и подключить его как расширение, чтобы не трогать ядро.

sergeche avatar Nov 03 '15 16:11 sergeche

Вариант с фильтром — вариант гораздо лучше (терпеть не могу лезть в ядро приложения). Где почитать про API? Или какие-то примеры, может?

nicothin avatar Nov 03 '15 17:11 nicothin

Вопрос актуален по сию пору. @sergeche каковы шансы этой задачи попасть в TODO-лист?

nicothin avatar Jun 20 '16 11:06 nicothin

Вы можете написать свой фильтр и сделать Pull Request. Документации по фильтрам нет, но это обычная функция, которая на вход принимает распарсенную аббревиатуру в виде дерева и может его изменить, например, поменять атрибуты местами

sergeche avatar Jun 20 '16 11:06 sergeche

Переопределил сниппет для a (http://s020.radikal.ru/i717/1703/c0/8127577c2b25.png), без фильтров работает, как надо: a.xxx --> <a class="xxx" href=""></a> Но при использовании фильтра bem результат получается некорректным, имя класса дублируется: a.xxx|bem --> <a class="xxx xxx" href=""></a> div.yyy>a.-xxx|bem --> <a class="yyy__xxx -xxx" href=""></a> Возможно ли как-то этого избежать? @sergeche

DDyst avatar Mar 06 '17 20:03 DDyst

@DDyst эта возможность есть в новой версии ядра, которая пока есть в альфа-версии для Atom

sergeche avatar Mar 09 '17 09:03 sergeche

А как ее посмотреть/опробовать? )

yeah-not avatar Sep 14 '17 14:09 yeah-not

https://github.com/emmetio/atom-plugin

sergeche avatar Sep 14 '17 15:09 sergeche

Сергей, намекните хоть в каком файле искать эту самую возможность - я смотрю структура файлов изрядно изменилась О_о... Кастомизировать пока можно напрямую в ядре только правильно? Да, и |bem - теперь как? Зы.. А я думал, что emmet уже не может быть лучше, а тут такое грядет!!))

yeah-not avatar Sep 14 '17 15:09 yeah-not

  1. Заходим в пользовательские настройки Emmet: Preferences -> Package Settings -> Emmet -> Settings User
  2. Вставляем следующий снипет:
{
  "snippets": {
    "html": {
      "abbreviations": {
        "a": "<a class='' href=''>"
        }
      }
    }
}

Prepros avatar May 17 '19 11:05 Prepros

Ну и получаем все ссылки всегда с классами :)

yeah-not avatar Jul 02 '19 15:07 yeah-not

Сделал начальную реализацию объединения атрибутов в обратном порядке при резолвинге сниппетов: сначала те, что написали в аббревиатуре, потом те, что объявлены в сниппете (см. ссылку на коммит выше). Это похоже на ожидаемое поведение?

Другой вариант: объявлять в сниппете неявные атрибуты (с восклицательным знаком в начале): "foo": "my-tag[title !class]" Суть неявных атрибутов в том, чтобы они выводились только в том случае, если у них есть значение. То есть по сути с помощью неявных атрибутов можно указать порядок, в котором должны выводится атрибуты, независимо от того, в каком порядке они были объявлены в аббревиатуре

sergeche avatar Aug 20 '19 21:08 sergeche

Чуваки есть решение В конфиге vs code прописать такое "emmet.preferences": { "output.reverseAttributes": true }

Alexeytyurin143 avatar Feb 16 '22 19:02 Alexeytyurin143

В VS Code есть файл где хранятся все пользовательские настройки, называется settings.json вставляешь этот код: "emmet.preferences": { "output.reverseAttributes": true }, и атрибут "class" располагается впереди других атрибутов.

Было так: <img src="" alt="" class="logo__image"> Стало так: <img class="logo__image" src="" alt="">

BISCVI avatar Mar 09 '24 15:03 BISCVI