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.
        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.

``<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 DocumentFragment that you can obtain
   from the element's "content" attribute.

``<script>``
 - Blocks until all previous imports have been loaded, then runs the
   script, with either 'module' or 'application' as the first
   argument, the exports of any imports that have "as" attributes at
   this time passed in as subsequent arguments, and with "this" set to
   null.

``<style>``
 - Adds the contents to the document'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.

``<shadow>``
 - In a shadow tree, acts as an insertion point for older shadow trees.

``<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.

``<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 document's title (as provided by Sky to
   the view manager). (Actually just ensures that any time the element
   is mutated, theTitleElement.ownerScope.ownerDocument.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)
