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