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 sky:core (basically, sky:core 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 DocumentFragment 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 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.

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