Sky Markup: Syntax
==================

A Sky file must consist of the following components:

 1. If the file is intended to be a top-level Sky application, the
    string "``#!mojo mojo:sky``" followed by a U+0020, U+000A or
    U+000D character.

    If the file is intended to be a module, then the string "SKY", a
    U+0020 (space) character, the string "MODULE", and a U+0020,
    U+000A or U+000D character.

    These signatures make it more difficult to e.g. embed some Sky
    markup into a PNG and then cause someone to import that image as a
    module.

 2. Zero or more of the following, in any order:
     - comments
     - text
     - escapes
     - elements

Sky files must be encoded using UTF-8.

A file that doesn't begin with the "``#!mojo mojo:sky``" signature
isn't a Sky application file. For example:

    #!mojo https://example.com/runtimes/sky.asmjs
    Hello World

...is not a Sky file, even if ``https://example.com/runtimes/sky.asmjs``
is an implementation of the Sky runtime: it's just a file intended
specifically for that runtime.

The ``mojo:sky`` URL represents the generic Sky runtime provided by
your Mojo runtime vendor.


Comments
--------

Comments start with the sequence "``<!--``" and end with the
sequence "``-->``", where the start and end hyphens don't overlap.
In between these characters, any sequence of characters is allowed
except "``-->``", which terminates the comment. Comments cannot,
therefore, be nested.


Text
----

Any sequence of Unicode characters other than ``<``, ``&``, and
U+0000.


Escapes
-------

There are three kinds of escapes:

### Hex

They begin with the sequence ``&#x`` or ``&#X``, followed by a
sequence of hex characters (lowercase or uppercase), followed by a
semicolon. The number 0 is not allowed.

### Decimal

They begin with the sequence ``&#`` or ``&#``, followed by a
sequence of decimal characters, followed by a semicolon. The number 0
is not allowed.

### Named

They begin with the sequence ``&``, followed by any characters,
followed by a semicolon.

The following names work:

| Name | Character | Unicode |
| ---- | --------- | ------- |
| `lt` | `<` | U+003C LESS-THAN SIGN character |
| `gt` | `>` | U+003E GREATER-THAN SIGN character |
| `amp` | `&` | U+0026 AMPERSAND character |
| `apos` | `'` | U+0027 APOSTROPHE character |
| `quot` | `"` | U+0022 QUOTATION MARK character |


Elements
--------

An element consists of the following:

1. ``<``
2. Tag name: A sequence of characters other than ``/``, ``>``,
   U+0020, U+000A, U+000D (whitespace).
3. Zero or more of the following:
   1. One or more U+0020, U+000A, U+000D (whitespace).
   2. Attribute name: A sequence of characters other than ``/``,
      ``=``, ``>``, U+0020, U+000A, U+000D (whitespace).
   3. Optionally:
      1. Zero or more U+0020, U+000A, U+000D (whitespace) characters.
      2. ``=``
      3. Zero or more U+0020, U+000A, U+000D (whitespace) characters.
      4. Attribute value: Either:
         - ``'`` followed by attribute text other than ``'``
           followed by a terminating ``'``.
         - ``"`` followed by attribute text other than ``'``
           followed by a terminating ``"``.
         - attribute text other than ``/``, ``>``,
           U+0020, U+000A, U+000D (whitespace).
         "Attribute text" is escapes or any unicode characters other
         than U+0000.
4. Either:
   - For a void element:
     1. ``/``, indicating an empty element.
     2. ``>``
   - For a non-void element:
     2. ``>``
     3. The element's contents:
        - If the element's tag name is ``script``, then any sequence of
          characters other than U+0000, but there must not be the
          substring ``</script``. The sequence must be valid sky script.
        - If the element's tag name is ``style``, then any sequence of
          characters other than U+0000, but there must not be the
          substring ``</style``. The sequence must be valid sky style.
        - Otherwise, zero or more of the following, in any order:
          - comments
          - text
          - escapes
          - elements
     4. Finally, the end tag, which may be omitted if the element's tag
        name is not ``template``, consisting of:
        1. ``<``
        2. ``/``
        3. Same sequence of characters as "tag name" above; this may
           be omitted if no start tags have had their end tag omitted
           since this element's start tag, unless this element's tag
           name is ``script`` or ``style``.
        4. ``>``


Sky Markup: Elements
====================

The Sky language consists of very few elements, since it is expected
that everything of note would be provided by frameworks.

The following elements are implicitly registered by default, even if
you haven't imported anything. You can get to their constructors if
you import dart:sky (basically, dart:sky is always imported by defaul;
it's the runtime library). None of these elements have shadow trees.

``<import src="foo.sky">``
 - Downloads and imports foo.sky in the background.

``<import src="foo.sky" as="foo">``
 - Downloads and imports foo.sky in the background, using "foo" as its
   local name (see ``<script>``).

``<template>``
 - The contents of the element aren't placed in the Element itself.
   They are instead placed into a Fragment that you can obtain from
   the element's "content" attribute.

``<script>``
 - Blocks until all previous imports have been loaded, then loads the
   library given in the script block, as described in
   [scripts.md](scripts.md).

``<style>``
 - Adds the contents to the module's styles.

``<content>``
``<content select="...">``
 - In a shadow tree, acts as an insertion point for distributed nodes.
   The select="" attribute gives the selector to use to pick the nodes
   to place in this insertion point; it defaults to everything.

``<img src="foo.bin">``
 - Sky fetches the bits for foo.bin, looks for a decoder for those
   bits, and renders the bits that the decoder returns.

``<div>``
 - Element that does nothing.

``<span>``
 - Element that does nothing.

``<iframe src="foo.bin">``
 - Sky tells mojo to open an application for foo.bin, and hands that
   application a view so that the application can render appropriately.

``<t>``
 - Within a ``<t>`` section, whitespace is not trimmed from the start and
   end of text nodes by the parser.
   TOOD(ianh): figure out if the authoring aesthetics of this are ok

``<a href="foo.bin">``
 - A widget that, when invoked, causes mojo to open a new application
   for "foo.bin".

``<title>``
 - Sets the contents as the application's title (as provided by Sky to
   the view manager). (Actually just ensures that any time the element
   is mutated, module.application.title is set to the element's
   contents.)


Sky Markup: Global Attributes
=============================

The following attributes are available on all elements:

* ``id=""`` (any value)
* ``class=""`` (any value, space-separated)
* ``style=""`` (declaration part of a Sky style rule)
* ``lang=""`` (language code)
* ``dir=""`` (ltr or rtl only)
* ``contenteditable=""`` (subject to future developments)
* ``tabindex=""`` (subject to future developments)
