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:

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