AAML: Простейший язык разметки для Android

    Возможно вы сочтете это глупостью, но я не люблю IDE. Обычно всю работу проделываю в vim+tmux+терминал. Я признаю все преимущества IDE, просто мне удобнее в хорошем текстовом редакторе. Но речь не об этом.

    Когда я пишу что-нибудь под андроид — я часто правлю XML (разметку, стили, строки, ...). Так вот в текстовом редакторе это делать не очень удобно. И я решил потратить пару часов и написать генератор XML на основе упрощенного языка разметки (типа lesscss или stylus для CSS). Все-таки NIH — очень уж соблазнительный стимул.

    Язык AAML (another android markup language) получился с очень простым синтаксисом. Элементы начинаются с двоеточий. Запятые (или переносы строк) разделяют атрибуты. Табами (или пробелами, или и тем и другим) определяется вложенность элементов. Комментарии начинаются с решетки. Какой-нибудь простенький layout выглядит так:

    # Main layout
    :LinearLayout layout fill, padding 0dp 16dp, orientation vertical
            :EditText
                    layout fill wrap
                    hint @string/to
            :EditText
                    layout fill wrap
                    hint @string/subject
            :EditText
                    layout fill 0dp 1
                    gravity top
                    hint @string/message
            :Button#btn_send
                    layout 100dp wrap
                    gravity right
                    text @string/send
    

    Такая AAML-разметка компилируется в:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Main layout -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:paddingTop="0dp"
    	android:paddingRight="16dp"
    	android:paddingBottom="0dp"
    	android:paddingLeft="16dp"
    	android:orientation="vertical">
    	<EditText
    		android:layout_width="fill_parent"
    		android:layout_height="match_parent"
    		android:hint="@string/to" />
    	<EditText
    		android:layout_width="fill_parent"
    		android:layout_height="match_parent"
    		android:hint="@string/subject" />
    	<EditText
    		android:layout_width="fill_parent"
    		android:layout_height="0dp"
    		android:layout_weight="1"
    		android:gravity="top"
    		android:hint="@string/message" />
    	<Button
    		android:id="@+id/btn_send"
    		android:layout_width="100dp"
    		android:layout_height="match_parent"
    		android:gravity="right"
    		android:text="@string/send" />
    </LinearLayout>
    

    Еще по принципу DRY есть поддержка макросов и алиасов. Алиасы позволяют задать новое имя чему-либо — атрибуту (чтобы писать «wrap» вместо «wrap_content»), значению (чтобы определить цвет или размер шрифта один раз и использовать алиас как имя переменной) и т.д.

    Макросы же принимают ряд аргументов. Аргументам имена правда давать нельзя (да и макросы предполагаются только самые простые). Вместо этого используются позиционные аргументы, как в Bash ($1, $2, $3 и т.д.). Вот макросы и алиасы, используемые в примере выше:

    # Алиасы
    :def wrap wrap_content
    :def fill match_parent
    :def match match_parent
    
    # Макросы
    :def layout:3 layout_widht $1, layout_height $2, layout_weight $3
    :def layout:2 layout_widht $1, layout_height $2
    :def layout:1 layout $1 $1
    
    :def padding:4 paddingTop $1, paddingRight $2, paddingBottom $3, paddingLeft $4
    :def padding:2 padding $1 $2 $1 $2
    :def padding:1 padding $1 $1
    

    Наверное, подобные макросы следует сделать стандартными для разных видов XML (для layout — одни, для strings — другие и т.д.)

    Написан AAML на python. Никаких зависимостей не имеет, кода там всего строк на 200. Работает в двух режимах — конвертирует файл *.aaml в *.xml или рекурсивно обрабатывает все файлы из одной папки и помещает полученные xml в другую. Это удобно, если создать aaml/layout, aaml/values, aaml/xml и полученные результаты складывать в res/layout и т.д.

    Чтобы автоматизировать этот процесс можно создать custom_rules.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project>
        <target name="-pre-build">
            <exec executable="aaml">
                <arg value="aaml"/>
                <arg value="res"/>
            </exec>
        </target>
    </project>
    

    Теперь aaml будет конвертироваться в xml при каждой сборке проекта автоматически.

    Исходники находятся на bitbucket: bitbucket.org/zserge/aaml
    Лицензия — MIT.

    В завершение поста у меня вопрос к хабровчанам — стоит ли развивать этот проект? Есть ли еще фрики, которые пишут XML вручную? Если да — то любые предложения, фича-реквесты, замечания, баги, критика приветствуются.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 12

      +3
      Конечно развивайте!

      Я пишу xml вручную, но в Eclipse.
      Хорошо бы кто-нибудь ещё написал плагин для Eclipse, автоматически компилирующий aaml в xml (при сборке, или Build automaticaly).
        +1
        Спасибо! Да, я когда изредка открываю Eclipse — тоже правлю вручную XML и тоже думал о такой интеграции. Надо будет поучиться делать плагины под Eclipse. Еще бы найти добровольца на модули подсветки синтаксиса для SublimeText, Emacs и других популярных редакторов.
        +3
        Сомнительно как-то всё это)
          0
          Amlcode.com — не смотрели? Синтаксис похож больше на хтмл, но поддерживаются еще и айфон с вин фоном.
            0
            Ну там скорее другой подход к верстке (и как я понял они только res/layout/*.xml позволяют создавать). Мне привычнее мыслить в стиле верстки андроида: надо таблица — бери TableLayout вместо table/tr/td, надо список — ListView+Adapter вместо list+item. Хотя для кросс-платформенной верстки простых интерфейсов думаю amlcode вполне пригоден.
              +1
              В том-то и дело, что простых интерфейсов. Которых с каждым годом становится все меньше.
            +1
            Развивать. Однозначно! (-:
            Спасибо.
              +1
              Я тоже пилю нечто подобное, но я решил вообще отказаться от ручной расстановки аттрибутов, да и вообще дробления layout/code. Некое подобие QML.
                +1
                Лично у меня на правку layout xml затрачивается примерно один процент от всего объема работ, так что для меня профит сомнительный
                Но идея интересная, буду наблюдать.
                  0
                  Я все layout'ы как правило программно делаю. С другой стороны…

                  В завершение поста у меня вопрос к хабровчанам — стоит ли развивать этот проект?
                  Если ваш проект намного упростит работу с разметкой, то стал бы использовать.
                    0
                    По-моему, в Idea за счет intellisense верстка xml-ек для layout-ов существенно ускоряется. И полноценную xml можно сверстать быстрее, чем через подобный промежуточный язык разметки.
                      0
                      Мне очень нравится подход, который дает scaloid: github.com/pocorall/scaloid#ui-layout-without-xml

                      Only users with full accounts can post comments. Log in, please.