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 runs the
   script, with 'module' 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.

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

``<error>``
 - Represents a parse error.


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)
