Компиляция из html в jade. Туториал по Jade для начинающих. Что такое Jade

CREATE TABLE

sql-command::=

CREATE TABLE table-name (

Column-def [, column-def]*

[, constraint]*

sql-command::=

CREATE TABLE table-name AS select-statement

column-def::=

name [ column-constraint]*

type::=

typename |

typename (number) |

typename (number , number)

column-constraint::=

NOT NULL [ conflict-clause ] |

PRIMARY KEY [ conflict-clause ] |

UNIQUE [ conflict-clause ] |

CHECK (expr) |

DEFAULT value |

COLLATE collation-name

constraint::=

PRIMARY KEY (column-list) [ conflict-clause ] |

UNIQUE (column-list) [ conflict-clause ] |

CHECK (expr)

conflict-clause::=

ON CONFLICT conflict-algorithm

В команде CREATE TABLE за ключевым словом "CREATE TABLE" обычно следует имя таблицы и список определений полей и условий. Имя таблицы может быть как идентификатором, так и строкой. Имена, начинающиеся с "sqlite_" зарезервированы для использования движком.

Каждое определение поля таблицы состоит из его имени, типа и одним или несколькими дополнительными условиями. Тип данных для поля, не ограничивает размещение в нем данных. Для дополнительной информации смотрите Типы данных в SQLite версии 3. Ограничение UNIQUE вызывает создание индекса на заданных полях. Оператор COLLATE определяет для функцию сравнения, которая будет использоваться для этого поля. По умолчанию применяется встроенная функция BINARY.

Условие DEFAULT определяет значение по умолчанию, которое используется при вставке INSERT. Значение может быть NULL, строковой константой или числом. Начиная с версии 3.1.0, значение по умолчанию, может также принимать специальные ключевые слова CURRENT_TIME, CURRENT_DATE или CURRENT_TIMESTAMP. Если значение NULL, строка или число, оно вставляется без изменений в поле, если в команде INSERT не определено значение для этого поля. Если значение CURRENT_TIME, CURRENT_DATE или CURRENT_TIMESTAMP, тогда текущая UTC дата и/или время вставляются в поля. Для CURRENT_TIME, формат HH:MM:SS. Для CURRENT_DATE, YYYY-MM-DD. Формат для CURRENT_TIMESTAMP - "YYYY-MM-DD HH:MM:SS".

Определение PRIMARY KEY обычно просто создает индекс UNIQUE на заданных полях. Однако, если первичный ключ на одном столбце имеет тип INTEGER, тогда этот столбец будет использоваться внутри как реальный ключ для B-Дерева (B-Tree) таблицы. Это означает, что поле может содержать только уникальное целое значение. (Исключение в одном случае, SQLite игнорирует типы данных полей и позволяет хранить данные любого типа, независимо от их описания.) Если таблица не имеет поля с INTEGER PRIMARY KEY, тогда целый ключ B-Дерева (B-Tree) будет создан автоматически. Доступ к ключу B-Tree записи всегда можно получить, используя специальные имена "ROWID", "OID", или "_ROWID_". Это верно независимо от наличия INTEGER PRIMARY KEY. После INTEGER PRIMARY KEY также может содержать ключевое слово AUTOINCREMENT. Ключевое слово AUTOINCREMENT изменяет способ автоматической генерации B-Tree. Дополнительная информация о автоматической генерации B-Tree доступна отдельно.

В соответствии со стандартом SQL, PRIMARY KEY подразумевает NOT NULL. К сожалению, по давнему недосмотру, это не так в случае SQLite. SQLite допускает значения NULL в столбцах PRIMARY KEY. Мы можем изменить SQLite для соответствия стандарту (и возможно это будет сделано в будущем), но за прошедшее время, SQLite получил настолько широкое распространения, что мы боимся сделать ошибочным код, который сейчас корректен, если мы исправим проблему. Поэтому сейчас мы решили разрешить NULL в столбцах PRIMARY KEY. Разработчики должны помнить, что мы можем изменить SQLite в соответствии со стандартом SQL в будущем и должны разрабатывать новые программы в соответствии с ним.

Если ключевые слова "TEMP" или "TEMPORARY" используются между "CREATE" и "TABLE", тогда таблица создается только в рамках соединения с базой и автоматически удаляется при его закрытии. Все индексы, созданные для временной таблицы, также временны. Временные таблицы и индексы хранятся с отдельном файле, отличном от основного файла базы данных.

Если определено, тогда таблица создается в указанной базе. Ошибочно указывать одновременно оба и ключевое слово TEMP, если не "temp". Если имя базы не указано и ключевое слово TEMP не использовано, таблица создается в текущей базе данных.

Возможно указание оператора разрешения конфликтов для каждого условия, если требуется задать альтернативный алгоритм. По умолчанию используется алгоритм ABORT. Различные условия в одной таблице могут иметь различные алгоритмы по умолчанию для разрешения проблем. Если в командах COPY, INSERT или UPDATE определены отличные алгоритмы разрешения конфликтов, тогда они вытесняют алгоритмы, заданные в запросе CREATE TABLE. Для детальной информации смотрите ON CONFLICT.

Ограничение CHECK поддерживается с версии 3.3.0. До версии 3.3.0, CHECK мог указываться, но не соблюдался.

Нет явных ограничений по числу полей или количестве ограничений в таблице. Общий размер данных в одной записи ограничен примерно 1 мб в версии 2.8. В версии 3.0 нет жесткого лимита на объем данных в записи.

Форма определения таблицы CREATE TABLE AS создает таблицу из результата запроса. Имена полей таблицы берутся именами полей в результате запросе.

Точный текст каждого запроса CREATE TABLE хранится в таблице sqlite_master. Каждый раз при открытии базы, все запросы CREATE TABLE считываются из таблицы sqlite_master и используются для генерации внутреннего представления SQLite. Если оригинальной командой была CREATE TABLE AS, тогда создается ее эквивалент CREATE TABLE, который сохраняется в sqlite_master вместо оригинального запроса. Текст CREATE TEMPORARY TABLE хранится в таблице sqlite_temp_master.

Если указан опциональный оператор IF NOT EXISTS и уже есть другая таблица с таким именем, то команда не выполняется.

Это библиотека, написанная на языке C, которая обеспечивает работу с SQL. Данный инструмент относится к Реляционным системам управления базами данных . Большинство баз данных SQL работает по схеме клиент/сервер. Возьмём к примеру MySQL . В процессе работы данные берутся с MySQL сервера, и отправляются в качестве ответа на запрос. В случае использования SQLite, данные будут браться непосредственно с диска, т.е. не будет необходимости обращаться к серверу.

Установка

Мы будем взаимодействовать с базой данных через интерфейс командной строки sqlite3 (CLI) в Linux. Работа с sqlite3 CLI в MAC OS и Windows осуществляется таким же образом, однако я рекомендую вам потратить 5 минут на установку виртуальной машины, чтобы не захламлять свой компьютер лишним софтом.

Для установки sqlite3 на Linux выполняем команду:

sudo apt-get install sqlite3 libsqlite3-dev

В результате на вашей машине будет установлен sqlite3 . Для установки данного инструмента на других ОС следуйте инструкциям . Для запуска sqlite выполняем команду sqlite3 в консоли. Результат должен быть таким:

Во второй строчке указана подсказка о том, что для получения справки необходимо выполнить команду.help . Давайте сделаем это. В результате мы увидим Мета Команды и их описание.

Мета Команды

Мета Команды - предназначены для формирования таблиц и других административных операций. Все они оканчиваются точкой . Пройдёмся по списку команд, которые могут пригодиться:

Стандартные команды

Теперь давайте пройдёмся по списку стандартных команд sqlite3, которые предназначены для взаимодействия с базой данных. Стандартные команды могут быть классифицированы по трём группам:

  • Язык описания данных DDL : команды для создания таблицы, изменения и удаления баз данных, таблиц и прочего.
  • Язык управления данными DML : позволяют пользователю манипулировать данными (добавлять/изменять/удалять).
  • Язык запросов DQL : позволяет осуществлять выборку данных.
  • Заметка : SQLite так же поддерживает и множество других команд, список которых можно найти . Поскольку данный урок предназначен для начинающих, мы ограничимся перечисленным набором команд.

    Файлы баз данных SQLite являются кроссплатформенными . Они могут располагаться на различного рода устройствах.

    • Email
    • Комментарий

    Из всех этих полей только адрес сайта может быть пустым. Так же можем ввести колонку для нумерации комментриев. Назовём её post_id .

    Теперь давайте определимся с типами данных для каждой из колонок:

    Атрибут Тип данных
    post_id INTEGER
    name TEXT
    email TEXT
    website_url TEXT
    comment TEXT

    Вы сможете найти все типы данных, поддерживаемые в SQLite3.

    Так же следует отметить, в SQLite3 данные, вставляемые в колонку могут отличаться от указанного типа. В MySQL такое не пройдёт.

    Теперь давайте создадим базу данных. Если вы ещё находитесь в интерфейсе sqlite3, то наберите команду.quit для выхода. Теперь вводим:

    sqlite3 comment_section.db

    В результате, в текущем каталоге у нас появится файл comment_section.db .

    Заметка : если не указать название файла, sqlite3 создаст временную базу данных.

    Создание таблицы

    Для хранения комментариев нам необходимо создать таблицу. Назовём её comments . Выполняем команду:

    CREATE TABLE comments (post_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL, website_url TEXT NULL, comment TEXT NOT NULL);

    NOT NULL обеспечит уверенность, что ячейка не будет содержать пустое значение. PRIMARY KEY и AUTOINCREMENT расширяют возможности поля post_id .

    Чтобы убедиться в том, что таблица была создана, выполняем мета команду.tables . В результате видим нашу таблицу comments .

    Заметка : Для получения структуры таблицы наберите.schema comments

    Теперь можем внести данные в таблицу.

    ВСТАВКА СТРОК

    Предположим, что нам необходим внести следующую запись:

    Name: Shivam Mamgain Email: [email protected] Website: shivammg.blogspot.com Comment: Great tutorial for beginners.

    Для вставки воспользуемся командой INSERT .

    INSERT INTO comments (name, email, website_url, comment) VALUES ("Shivam Mamgain", "[email protected]", "shivammg.blogspot.com", "Great tutorial for beginners.");

    Указывать значение для post_id не нужно т.к. оно сформируется автоматически благодаря настройке AUTOINCREMENT .

    Чтобы набить руку можете вставить ещё несколько строк.

    ВЫБОРКА

    Для выборки данных воспользуемся командой SELECT .

    SELECT post_id, name, email, website_url, comment FROM comments;

    Этот же запрос может выглядеть так:

    SELECT * FROM comments;

    В результате из таблицы будут извлечены все строки. Результат может выглядеть без разграничения по колонкам и без заголовка. Чтобы это исправить выполняем:

    Для отображения шапки введите.headers ON .

    Для отображения колонок выполните команду.mode column .

    Выполняем SELECT запрос ещё раз.

    Заметка : вид отображения можно изменить, воспользовавшись мета командой.mode .

    ОБНОВЛЕНИЕ

    Предположим, что поле email для пользователя ‘Shivam Mamgain’ необходимо изменить на ‘[email protected]’. Выполняем следующую команду:

    В результате запись будет изменена.

    Заметка : Значение в колонке name может быть не уникально, так что в результате работы команды может быть затронуто более одной строки. Для всех пользователей, где значение name = ‘Shivam Mamgain’, поле email будет изменено на ‘[email protected]’. Для изменения какой-то конкретной строки следует её отследить по полю post_id . Мы его определили как PRIMARY KEY , что обеспечивает уникальность значения.

    SQLite – это автономный, работающий без сервера транзакционный механизм базы данных SQL. Python получил модуль sqlite3 в версии 2.5, что значит что вы можете создавать базу данных SQLite в любой настоящей версии Python, без необходимости скачивания дополнительных инструментов. Mozilla использует базы данных SQLite в своем популярном браузере Firefox для хранения закладок и прочей различной информации. В данной статье мы рассмотрим следующее:

    • Как создать базу данных SQLite
    • Как вставить данные в таблицу
    • Как редактировать данные
    • Как удалять данные
    • Базовые запросы SQL

    Другими словами, вместо того чтобы собирать по кусочкам сам модуль, мы непосредственно ознакомимся с тем, как его использовать.
    Если вы хотите визуально проверить свою базу данных, вы можете использовать плагин SQLite Manager в Firefox (рекомендуем погуглить данный вопрос), или, если вы предпочитаете командную строку, вы можете использовать оболочку командной строки .

    Как создавать базу данных и вставлять различные данные

    Создание базы данных в SQLite – это очень просто, но процесс требует того, чтобы вы немного разбирались в том, что такое SQL. Давайте взглянем на код, который создаст базу данных для хранения музыкальных альбомов:

    Python

    import sqlite3 conn = sqlite3.connect("mydatabase.db") # или:memory: чтобы сохранить в RAM cursor = conn.cursor() # Создание таблицы cursor.execute("""CREATE TABLE albums (title text, artist text, release_date text, publisher text, media_type text) """)

    Сначала нам нужно модуль sqlite3 и создать связь с базой данных. Вы можете передать название файла или просто использовать специальную строку “:memory: ” для создания базы данных в памяти. В нашем случае, мы создаем его на диске в файле под названием mydatabase.db .

    Далее мы создаем объект cursor , который позволяет нам взаимодействовать с базой данных и добавлять записи, помимо всего прочего. Здесь мы используем синтаксис SQL для создания таблицы под названием альбомы с пятью следующими полями: title, artist, release_date, publisher и media_type . SQLite поддерживает только пять типов данных: null , integer , real , text и blob . Давайте напишем этот код и вставим кое-какие данные в нашей новой таблице. Запомните, если вы запускаете команду CREATE TABLE , при этом база данных уже существует, вы получите сообщение об ошибке.

    Python

    # Вставляем данные в таблицу cursor.execute("""INSERT INTO albums VALUES ("Glow", "Andy Hunter", "7/24/2012", "Xplore Records", "MP3")""") # Сохраняем изменения conn.commit() # Вставляем множество данных в таблицу используя безопасный метод "?" albums = [("Exodus", "Andy Hunter", "7/9/2002", "Sparrow Records", "CD"), ("Until We Have Faces", "Red", "2/1/2011", "Essential Records", "CD"), ("The End is Where We Begin", "Thousand Foot Krutch", "4/17/2012", "TFKmusic", "CD"), ("The Good Life", "Trip Lee", "4/10/2012", "Reach Records", "CD")] cursor.executemany("INSERT INTO albums VALUES (?,?,?,?,?)", albums) conn.commit()

    # Вставляем данные в таблицу

    cursor . execute ("""INSERT INTO albums

    VALUES ("Glow", "Andy Hunter", "7/24/2012",

    "Xplore Records", "MP3")"""

    # Сохраняем изменения

    conn . commit ()

    # Вставляем множество данных в таблицу используя безопасный метод "?"

    albums = [ ("Exodus" , "Andy Hunter" , "7/9/2002" , "Sparrow Records" , "CD" ) ,

    ("Until We Have Faces" , "Red" , "2/1/2011" , "Essential Records" , "CD" ) ,

    ("The Good Life" , "Trip Lee" , "4/10/2012" , "Reach Records" , "CD" ) ]

    cursor . executemany ("INSERT INTO albums VALUES (?,?,?,?,?)" , albums )

    conn . commit ()

    INSERT INTO SQL чтобы вставить запись в нашу базу данных. Обратите внимание на то, что каждый объект находится в одинарных кавычках . Это может усложнить работу, если вам нужно вставить строчки, которые содержат одинарные кавычки. В любом случае, чтобы сохранить запись в базе данных, нам нужно создать её. Следующая часть кода показывает, как добавить несколько записей за раз при помощи метода курсора . Обратите внимание на то, что мы используем знаки вопроса (? ), вместо строк замещения (%) чтобы вставить значения. Обратите внимание, что использование строки замещения не безопасно, так как может стать причиной появления атаки инъекций SQL . Использование знака вопроса намного лучше, а использование SQLAlchemy тем более, так как он делаете все необходимое, чтобы уберечь вас от правки встроенных одинарных кавычек на то, что SQLite в состоянии принимать.

    Редактирование и удаление записей

    Возможность обновлять записи в вашей базе данных это ключ к тому, чтобы ваши данные велись аккуратно, и был полный порядок. Если вы не можете редактировать данные , тогда ваша база станет бесполезной достаточно скоро. Иногда вам, в том числе, нужно будет удалять и строки. Мы рассмотрим оба вопроса в данном разделе. Для начала, давайте немного обновимся.

    Python

    Здесь мы использовали команду SQL UPDATE , чтобы обновить таблицу альбомов. Здесь вы можете использовать команду SET , чтобы изменить поле, так что в нашем случае мы изменим имя исполнителя на John Doe в каждой записи, где поле исполнителя указано для Andy Hunter. Весьма просто, не так ли? Обратите внимание на то, что если вы не подтвердите изменения, то они не будут внесены в базу данных. Команда DELETE настолько же проста. Давайте посмотрим.

    Python

    Удаление еще проще, чем обновление. У SQL это занимает всего две строчки. В данном случае, все, что нам нужно сделать, это указать SQLite , из какой таблицы удалить (albums), и какую именно запись при помощи пункта WHERE . Таким образом, был выполнен поиск записи, в которой присутствует имя “John Doe” в поле исполнителей, после чего эти данные были удалены .

    Основные запросы SQLite

    Запросы в SQLite очень похожи на те, которые вы используете в других базах данных, таких как MySQL или Postgres. Мы просто используем обычный синтаксис SQL для выполнения запросов, после чего объект cursor выполняет SQL. Вот несколько примеров:

    Python

    import sqlite3 conn = sqlite3.connect("mydatabase.db") #conn.row_factory = sqlite3.Row cursor = conn.cursor() sql = "SELECT * FROM albums WHERE artist=?" cursor.execute(sql, [("Red")]) print(cursor.fetchall()) # or use fetchone() print("Here"s a listing of all the records in the table:") for row in cursor.execute("SELECT rowid, * FROM albums ORDER BY artist"): print(row) print("Results from a LIKE query:") sql = "SELECT * FROM albums WHERE title LIKE "The%"" cursor.execute(sql) print(cursor.fetchall())

    • Перевод
    • Tutorial

    Jade - это препроцессор HTML и шаблонизатор, который был написан на JavaScript для Node.js. Проще говоря, Jade - это именно то средство, которое предоставляет вам возможность написания разметки совершенно по новому, с целым рядом преимуществ по сравнению с обычным HTML.
    К примеру, взгляните на код ниже в формате HTML:

    Ocean"s Eleven

    • Comedy
    • Thriller

    Danny Ocean and his eleven accomplices plan to rob three Las Vegas casinos simultaneously.


    А так эта разметка выглядит в формате Jade:
    div h1 Ocean"s Eleven ul li Comedy li Thriller p. Danny Ocean and his eleven accomplices plan to rob three Las Vegas casinos simultaneously.
    Второй вариант кажется более коротким и элегантным. Но Jade - это не только симпатичная разметка. Jade имеет некоторые действительно полезные функции, позволяющие писать модульный многоразовый (с возможностью многоразового использования) код. Но перед тем, как углубиться, давайте сделаем обзор основ.

    Основы

    Я собираюсь выделить три основные черты Jade:
    • Простые теги;
    • Добавление атрибутов в теги;
    • Блоки текста.
    Если вы хотите входе прочтения статьи пробывать примеры кода приведённые ниже, вы можете воспользоваться CodePen и выбрать Jade как препроцесор для вашего HTML, или воспользуйтесь онлайн компилятором на официальном сайте Jade .
    Теги
    Как вы могли заметить ранее, в Jade нет закрывающих тегов. Вместо этого Jade использует табуляцию для определения вложености тегов.
    div p Hello! p World!
    В приведенном выше примере, теги параграфов согласно их табуляции при компиляции в конечном итоге окажутся внутри тега div. Как просто!

    Jade компилирует это точно, рассматривая первое слово в каждой строке в качестве тега, в то время как последующие слова на этой строке обрабатываются как текст внутри тега.
    Атрибуты
    Всё это, конечно, хорошо, но как добавлять атрибуты нашим тегам? На самом деле довольно просто.
    Давайте вернёмся к нашему первому примеру и добавим туда пару классов и некую картинку-постер.
    div(class="movie-card", id="oceans-11") h1(class="movie-title") Ocean"s 11 img(src="/img/oceans-11.png", class="movie-poster") ul(class="genre-list") li Comedy li Thriller
    Как чудестно, не так ли?

    Ocean"s 11

    • Comedy
    • Thriller

    Но зачем останавливаться на достигнутом?! Jade предоставляет специальную стенографию для индификаторов и классов, что ещё больше упрощает нашу разметку, используя знакомые всем обозначения:
    div.movie-card#oceans-11 h1.movie-title Ocean"s 11 img.movie-poster(src="/img/oceans-11.png") ul.genre-list li Comedy li Thriller

    Как вы можете заметить, Jade использует синтаксис анологичный тому, который вы используете при написании CSS-селекторов.

    Блоки текста
    Давайте представим такую ситуацию: у вас есть тег <р> и вы хотите добавить в него довольно таки большой объём текста. Но стоп, ведь Jade рассматривает первое слово каждой строки как новый HTML-тег - и как тут быть?

    В самом первом примере вы уже могли заметить невзрачную точку после тега параграфа. Добавление точки после вашего тега даёт понять компилятору Jade, что всё внутри данного тега является текстом.
    div p How are you? p. I"m fine thank you. And you? I heard you fell into a lake? That"s rather unfortunate. I hate it when my shoes get wet.

    Для полной ясности: в случае, если я не поставил бы точку после тега <р> в примере, то скомпилированный HTML имел бы в себе открытый тег <і>, разорвав словосочетание “I’m” в начале строки.

    Полезные функции

    Теперь, когда мы разобрались с основами, давайте рассмотрим некоторые в действительности полезные функции, которые сделают нашу разметку умнее. Среди них:
    • JavaScript;
    • Циклы;
    • Интерполирование;
    • Миксины.
    JavaScript в Jade
    Jade реализован на JavaScript, по этому использовать JavaScript в Jade довольно просто. Вот пример:
    <=x; i++) { li Hello - }
    Что же мы тут сделали?! Начав строку с дефиса, мы указали компилятору Jade, что мыхотим использовать JavaScript, и всё, оно работает! И вот что мы получим, когда скомпилируем этот код в HTML:
    • Hello
    • Hello
    • Hello
    • Hello
    • Hello

    Мы используем дефис, когда код не должен напрямую попадать в поток вывода. В случае, ежели мы хотим использовать JavaScript для вывода чего-либо в Jade, мы используем = . Давайте подправим код выше, чтобы указать нумерацию элементов в списке:
    - var x = 5; div ul - for (var i=1; i<=x; i++) { li= i + ". Hello" - }
    И вуаля, у нас имеется нумерация:

    • 1. Hello
    • 2. Hello
    • 3. Hello
    • 4. Hello
    • 5. Hello

    Конечно, в данном случае нумерованный список был бы гораздо уместнее, но идею то вы уловили? Для более детальной информации ознакомтесь с документацией .

    Циклы
    Jade использует прекрасный синтаксис для написания циклов, так что вам не придётся прибегать к JavaScript. Давайте пройдёмся по элементам массива в цикле:
    - var droids = ["R2D2", "C3PO", "BB8"]; div h1 Famous Droids from Star Wars for name in droids div.card h2= name
    И это будет скомпилировано следующим образом:

    Famous Droids from Star Wars

    R2D2

    C3PO

    BB8

    Вы можете перемещаться по объектам массива, а также исспользовать цикл while. Узнайте больше прочитав документацию .

    Интерполирование
    Совмещать текст и JavaScript таким образом
    p= «Hi there, » + profileName + ". How are you doing?"
    может начать мусолить вам глаз. Разве Jade не имеет более элегантного решения данной задачи? Поспорим?
    - var profileName = "Danny Ocean"; div p Hi there, #{profileName}. How are you doing?

    Разве так не аккуратней?

    Миксины
    Миксины, они как функции, они принимают параметры в качестве входных данных и генерируют соответствующию разметку. Миксины оглашаются с помощью ключевого слова mixin .
    mixin thumbnail(imageName, caption) div.thumbnail img(src="/img/#{imageName}.jpg") h4.image-caption= caption
    После того, как миксин был оглашён, вы можете его вызвать с помощью символа + .
    +thumbnail("oceans-eleven", "Danny Ocean makes an elevator pitch.") +thumbnail("pirates", "Introducing Captain Jack Sparrow!")
    Что будет скомпилировано как:

    Danny Ocean makes an elevator pitch.

    Introducing Captain Jack Sparrow!

    Собираем все вместе

    Давайте соберём всё, что мы успели выучить, в один пример. Скажем, у нас есть массив фильмов, каждый объект которого содержит название фильма, актёрский состав (под-массив), рейтинг, жанр, ссылку на IMDB-страницу и путь к картинке (которая будет использована в качестве постера фильма). Массив будет иметь примерно такой выгляд:
    - var movieList = [ { title: "Ocean"s Eleven", cast: ["Julia Roberts", "George Clooney", "Brad Pitt", "Andy Garcia"], genres: ["Comedy", "Thriller"], posterImage: "/img/oceans-eleven", imdbURL: "http://www.imdb.com/title/tt0240772/", rating: 7 } // etc... ];
    У нас есть 10 фильмов и мы хотим сделать симпатичную разметку для каждого из них. Изначально, мы не предусмотрели использование ссылки на IMDB-страницу фильма. Если рейтинг фильма выше 5, мы даём ему иконку с поднятым большим пальцем руки вверх, в ином случае, большой палец - вниз. Мы используем все выше перечисленные полезные функции Jade для написания данного модульного кода, который выполнит следующие задачи:
    1. Создать миксин под названием movie-card
      • Перебрать массив и вывести актёрский состав.
      • Перебрать массив и вывести жанры.
      • Проверить рейтинг фильма и присвоить ему соответсвующею иконку.
    2. Пребрать массив фильмов и использовать миксин для создания разметки.

    И так, создадим миксин:
    mixin movie-card(movie) div.movie-card h2.movie-title= movie.title img.movie-poster(src=movie.posterImage) h3 Cast ul.cast each actor in movie.cast li= actor div.rating if movie.rating > 5 img(src="img/thumbs-up") else img(src="img/thumbs-down") ul.genre each genre in movie.genres li= genre
    В данном коде много чего происходит, но я уверен, что он вам понятен, так как мы это уже прошли. Теперь, всё, что нам нужно, - это вызвать данный миксин в цикле:
    for movie in movieList +movie-card(movie)
    И всё! Разве это не классно?! Вот окончательный код:
    - var movieList = [ { title: "Ocean"s Eleven", cast: ["Julia Roberts", "George Clooney", "Brad Pitt", "Andy Garcia"], genres: ["Comedy", "Thriller"], posterImage: "/img/oceans-eleven", imdbURL: "http://www.imdb.com/title/tt0240772/", rating: 9.2 }, { title: "Pirates of the Caribbean", cast: ["Johnny Depp", "Keira Knightley", "Orlando Bloom"], genres: ["Adventure", "Comedy"], posterImage: "/img/pirates-caribbean", imdbURL: "http://www.imdb.com/title/tt0325980/", rating: 9.7 } ]; mixin movie-card(movie) div.movie-card h2.movie-title= movie.title img.movie-poster(src=movie.posterImage) h3 Cast ul.cast each actor in movie.cast li= actor div.rating if movie.rating > 5 img(src="img/thumbs-up") else img(src="img/thumbs-down") ul.genre each genre in movie.genres li= genre for movie in movieList +movie-card(movie)
    А так код будет выглядеть после компиляции:

    Ocean"s Eleven

    Cast

    • Julia Roberts
    • George Clooney
    • Brad Pitt
    • Andy Garcia
    • Comedy
    • Thriller

    Pirates of the Carribean

    Cast

    • Johnny Depp
    • Keira Knightley
    • Orlando Bloom
    • Adventure
    • Comedy

    Но стоп, погодите минутку! А что, если теперь нам нужна возвожность переходить на IMDB-страницу фильма при нажатии на его название? Нам всего лишь потребуется добавить одну строку

    в наш миксин.
    mixin movie-card(movie) div.movie-card a(href=movie.imdbURL) h2.movie-title= movie.title img.movie-poster(src=movie.posterImage) h3 Cast ul.cast each actor in movie.cast li= actor div.rating if movie.rating > 5 img(src="img/thumbs-up") else img(src="img/thumbs-down") ul.genre each genre in movie.genres li= genre
    • Перевод
    • Tutorial

    Jade - это препроцессор HTML и шаблонизатор, который был написан на JavaScript для Node.js. Проще говоря, Jade - это именно то средство, которое предоставляет вам возможность написания разметки совершенно по новому, с целым рядом преимуществ по сравнению с обычным HTML.
    К примеру, взгляните на код ниже в формате HTML:

    Ocean"s Eleven

    • Comedy
    • Thriller

    Danny Ocean and his eleven accomplices plan to rob three Las Vegas casinos simultaneously.


    А так эта разметка выглядит в формате Jade:
    div h1 Ocean"s Eleven ul li Comedy li Thriller p. Danny Ocean and his eleven accomplices plan to rob three Las Vegas casinos simultaneously.
    Второй вариант кажется более коротким и элегантным. Но Jade - это не только симпатичная разметка. Jade имеет некоторые действительно полезные функции, позволяющие писать модульный многоразовый (с возможностью многоразового использования) код. Но перед тем, как углубиться, давайте сделаем обзор основ.

    Основы

    Я собираюсь выделить три основные черты Jade:
    • Простые теги;
    • Добавление атрибутов в теги;
    • Блоки текста.
    Если вы хотите входе прочтения статьи пробывать примеры кода приведённые ниже, вы можете воспользоваться CodePen и выбрать Jade как препроцесор для вашего HTML, или воспользуйтесь онлайн компилятором на официальном сайте Jade .
    Теги
    Как вы могли заметить ранее, в Jade нет закрывающих тегов. Вместо этого Jade использует табуляцию для определения вложености тегов.
    div p Hello! p World!
    В приведенном выше примере, теги параграфов согласно их табуляции при компиляции в конечном итоге окажутся внутри тега div. Как просто!

    Jade компилирует это точно, рассматривая первое слово в каждой строке в качестве тега, в то время как последующие слова на этой строке обрабатываются как текст внутри тега.
    Атрибуты
    Всё это, конечно, хорошо, но как добавлять атрибуты нашим тегам? На самом деле довольно просто.
    Давайте вернёмся к нашему первому примеру и добавим туда пару классов и некую картинку-постер.
    div(class="movie-card", id="oceans-11") h1(class="movie-title") Ocean"s 11 img(src="/img/oceans-11.png", class="movie-poster") ul(class="genre-list") li Comedy li Thriller
    Как чудестно, не так ли?

    Ocean"s 11

    • Comedy
    • Thriller

    Но зачем останавливаться на достигнутом?! Jade предоставляет специальную стенографию для индификаторов и классов, что ещё больше упрощает нашу разметку, используя знакомые всем обозначения:
    div.movie-card#oceans-11 h1.movie-title Ocean"s 11 img.movie-poster(src="/img/oceans-11.png") ul.genre-list li Comedy li Thriller

    Как вы можете заметить, Jade использует синтаксис анологичный тому, который вы используете при написании CSS-селекторов.

    Блоки текста
    Давайте представим такую ситуацию: у вас есть тег <р> и вы хотите добавить в него довольно таки большой объём текста. Но стоп, ведь Jade рассматривает первое слово каждой строки как новый HTML-тег - и как тут быть?

    В самом первом примере вы уже могли заметить невзрачную точку после тега параграфа. Добавление точки после вашего тега даёт понять компилятору Jade, что всё внутри данного тега является текстом.
    div p How are you? p. I"m fine thank you. And you? I heard you fell into a lake? That"s rather unfortunate. I hate it when my shoes get wet.

    Для полной ясности: в случае, если я не поставил бы точку после тега <р> в примере, то скомпилированный HTML имел бы в себе открытый тег <і>, разорвав словосочетание “I’m” в начале строки.

    Полезные функции

    Теперь, когда мы разобрались с основами, давайте рассмотрим некоторые в действительности полезные функции, которые сделают нашу разметку умнее. Среди них:
    • JavaScript;
    • Циклы;
    • Интерполирование;
    • Миксины.
    JavaScript в Jade
    Jade реализован на JavaScript, по этому использовать JavaScript в Jade довольно просто. Вот пример:
    <=x; i++) { li Hello - }
    Что же мы тут сделали?! Начав строку с дефиса, мы указали компилятору Jade, что мыхотим использовать JavaScript, и всё, оно работает! И вот что мы получим, когда скомпилируем этот код в HTML:
    • Hello
    • Hello
    • Hello
    • Hello
    • Hello

    Мы используем дефис, когда код не должен напрямую попадать в поток вывода. В случае, ежели мы хотим использовать JavaScript для вывода чего-либо в Jade, мы используем = . Давайте подправим код выше, чтобы указать нумерацию элементов в списке:
    - var x = 5; div ul - for (var i=1; i<=x; i++) { li= i + ". Hello" - }
    И вуаля, у нас имеется нумерация:

    • 1. Hello
    • 2. Hello
    • 3. Hello
    • 4. Hello
    • 5. Hello

    Конечно, в данном случае нумерованный список был бы гораздо уместнее, но идею то вы уловили? Для более детальной информации ознакомтесь с документацией .

    Циклы
    Jade использует прекрасный синтаксис для написания циклов, так что вам не придётся прибегать к JavaScript. Давайте пройдёмся по элементам массива в цикле:
    - var droids = ["R2D2", "C3PO", "BB8"]; div h1 Famous Droids from Star Wars for name in droids div.card h2= name
    И это будет скомпилировано следующим образом:

    Famous Droids from Star Wars

    R2D2

    C3PO

    BB8

    Вы можете перемещаться по объектам массива, а также исспользовать цикл while. Узнайте больше прочитав документацию .

    Интерполирование
    Совмещать текст и JavaScript таким образом
    p= «Hi there, » + profileName + ". How are you doing?"
    может начать мусолить вам глаз. Разве Jade не имеет более элегантного решения данной задачи? Поспорим?
    - var profileName = "Danny Ocean"; div p Hi there, #{profileName}. How are you doing?

    Разве так не аккуратней?

    Миксины
    Миксины, они как функции, они принимают параметры в качестве входных данных и генерируют соответствующию разметку. Миксины оглашаются с помощью ключевого слова mixin .
    mixin thumbnail(imageName, caption) div.thumbnail img(src="/img/#{imageName}.jpg") h4.image-caption= caption
    После того, как миксин был оглашён, вы можете его вызвать с помощью символа + .
    +thumbnail("oceans-eleven", "Danny Ocean makes an elevator pitch.") +thumbnail("pirates", "Introducing Captain Jack Sparrow!")
    Что будет скомпилировано как:

    Danny Ocean makes an elevator pitch.

    Introducing Captain Jack Sparrow!

    Собираем все вместе

    Давайте соберём всё, что мы успели выучить, в один пример. Скажем, у нас есть массив фильмов, каждый объект которого содержит название фильма, актёрский состав (под-массив), рейтинг, жанр, ссылку на IMDB-страницу и путь к картинке (которая будет использована в качестве постера фильма). Массив будет иметь примерно такой выгляд:
    - var movieList = [ { title: "Ocean"s Eleven", cast: ["Julia Roberts", "George Clooney", "Brad Pitt", "Andy Garcia"], genres: ["Comedy", "Thriller"], posterImage: "/img/oceans-eleven", imdbURL: "http://www.imdb.com/title/tt0240772/", rating: 7 } // etc... ];
    У нас есть 10 фильмов и мы хотим сделать симпатичную разметку для каждого из них. Изначально, мы не предусмотрели использование ссылки на IMDB-страницу фильма. Если рейтинг фильма выше 5, мы даём ему иконку с поднятым большим пальцем руки вверх, в ином случае, большой палец - вниз. Мы используем все выше перечисленные полезные функции Jade для написания данного модульного кода, который выполнит следующие задачи:
    1. Создать миксин под названием movie-card
      • Перебрать массив и вывести актёрский состав.
      • Перебрать массив и вывести жанры.
      • Проверить рейтинг фильма и присвоить ему соответсвующею иконку.
    2. Пребрать массив фильмов и использовать миксин для создания разметки.

    И так, создадим миксин:
    mixin movie-card(movie) div.movie-card h2.movie-title= movie.title img.movie-poster(src=movie.posterImage) h3 Cast ul.cast each actor in movie.cast li= actor div.rating if movie.rating > 5 img(src="img/thumbs-up") else img(src="img/thumbs-down") ul.genre each genre in movie.genres li= genre
    В данном коде много чего происходит, но я уверен, что он вам понятен, так как мы это уже прошли. Теперь, всё, что нам нужно, - это вызвать данный миксин в цикле:
    for movie in movieList +movie-card(movie)
    И всё! Разве это не классно?! Вот окончательный код:
    - var movieList = [ { title: "Ocean"s Eleven", cast: ["Julia Roberts", "George Clooney", "Brad Pitt", "Andy Garcia"], genres: ["Comedy", "Thriller"], posterImage: "/img/oceans-eleven", imdbURL: "http://www.imdb.com/title/tt0240772/", rating: 9.2 }, { title: "Pirates of the Caribbean", cast: ["Johnny Depp", "Keira Knightley", "Orlando Bloom"], genres: ["Adventure", "Comedy"], posterImage: "/img/pirates-caribbean", imdbURL: "http://www.imdb.com/title/tt0325980/", rating: 9.7 } ]; mixin movie-card(movie) div.movie-card h2.movie-title= movie.title img.movie-poster(src=movie.posterImage) h3 Cast ul.cast each actor in movie.cast li= actor div.rating if movie.rating > 5 img(src="img/thumbs-up") else img(src="img/thumbs-down") ul.genre each genre in movie.genres li= genre for movie in movieList +movie-card(movie)
    А так код будет выглядеть после компиляции:

    Ocean"s Eleven

    Cast

    • Julia Roberts
    • George Clooney
    • Brad Pitt
    • Andy Garcia
    • Comedy
    • Thriller

    Pirates of the Carribean

    Cast

    • Johnny Depp
    • Keira Knightley
    • Orlando Bloom
    • Adventure
    • Comedy

    Но стоп, погодите минутку! А что, если теперь нам нужна возвожность переходить на IMDB-страницу фильма при нажатии на его название? Нам всего лишь потребуется добавить одну строку

    в наш миксин.
    mixin movie-card(movie) div.movie-card a(href=movie.imdbURL) h2.movie-title= movie.title img.movie-poster(src=movie.posterImage) h3 Cast ul.cast each actor in movie.cast li= actor div.rating if movie.rating > 5 img(src="img/thumbs-up") else img(src="img/thumbs-down") ul.genre each genre in movie.genres li= genre

    
    Top